2015-11-24 2 views
2

Я хотел бы проверить, существует ли шаблон в строке с использованием итерации.Проверьте, существует ли шаблон в строке

Вот что у меня есть, но в результате я все время становлюсь ложным.

public static void main(String args[]) { 
     String pattern = "abc"; 
     String letters = "abcdef"; 

     char[] patternArray = pattern.toCharArray(); 
     char[] lettersArray = letters.toCharArray(); 

     for(int i = patternArray.length - 1; i<= 2; i++){ 
      for(int j = lettersArray.length - 1; j <= 5;j++){ 
       if(patternArray[i] == lettersArray[j]){ 
        System.out.println("true"); 
       } else{ 
        System.out.println("false"); 
       } 
      } 
     } 
    } 

В основном я хотел бы проверить, если abc существует в строке abcdef

Примечание: Я не хочу использовать регулярное выражение, потому что это слишком легко. Я пытаюсь найти решение без него, потому что мне любопытно, как это сделать с итерацией.

+0

почему бы не использовать регулярное выражение – Ramanlfc

+0

@Ramanlfc потому, что регулярное выражение слишком легко :) Я пытаюсь найти решение без него, потому что мне интересно, как это сделать с итерационным – imbondbaby

+0

Что об использовании 'Струнный # contains'? –

ответ

1

Почему бы не так:

public static void main(String args[]) { 
    String pattern = "abc"; 
    String letters = "abcdef"; 

    char[] patternArray = pattern.toCharArray(); 
    char[] lettersArray = letters.toCharArray(); 
    boolean matched = false; 
    for(int i = 0; i< lettersArray.length-patternArray.length && !matched; i++){ 
     for(int j = 0; j < patternArray.length;j++){ 
      if(patternArray[j] == lettersArray[i+j]&&j+1==patternArray.length){ 
       matched = true; 
       System.out.println("true"); 
      } 
      else if(i+1 == lettersArray.length-patternArray.length && j+1 == patternArray.length){ 
       System.out.println("false"); 
     } 
    } 
} 
2
public static Boolean patternFinder(String str, String pattern){ 
    for (int i = 0; i <= str.length()-pattern.length();i++){ 
     Boolean found = true; 
     for (int f = 0; f < pattern.length();f++){ 
      if (pattern.charAt(f) != str.charAt(i+f)){ 
       found = false; 
       break; 
      } 
     } 
     if (found){ 
      return true; 
     } 
    } 
    return false; 
} 

Это очень простой алгоритм

в основном, вы перебрать строки с начала и проверьте, все буквы в шаблоне равны те, в этом конкретном индексе.

+0

Не работает для patternFinder («adfgdefabc», «abc») – user1291453

2

Если вы хотите, чтобы все матчи, я использовать список, чтобы сохранить совпадения адреса в строке.

String pattern = "abc"; 
    String letters = "defabcdefabc"; 
    int i = 0; 
    List<Integer> matches = new ArrayList(); 
    while (i <= letters.length() - pattern.length()) { 
     if (letters.substring(i, i + pattern.length()).equals(pattern)) 
      matches.add(i); 
     i += 1; 
    } 

Вы можете перебирать совпадения, если вы хотите совместить все совпадения с этим решением. Редактировать: язык изменен

+0

, который попросил вас использовать код python? Разве вы не видели тег 'java' в вопросе? Если его легко преобразовать в java, тогда разместите свой код, выполняя эту легкую задачу. Спасибо – manetsus

+0

Он не спрашивает, как я могу написать это в java, он спрашивает, как это понять, не используя регулярное выражение. Я изменил код на java на, я надеюсь, что нет синтаксической ошибки. – RockOnGom

+0

FYI, если пост-код OP в java, вы должны исправить его в java или написать программу в java, если тег 'java' существует в теге OP. – manetsus

2

Проблема в том, что у вас есть две петли для каждого массива. Здесь вам нужен одиночный цикл для перемещения в обоих массивах с использованием того же индекса.

3

Вот программа наивной последовательности, которая найдет все совпадения шаблона.

Не рекомендуется для чего-либо практического из-за сложности времени O (mn) (m и n - длины строки поиска и рисунка соответственно).

class Potato 
{ 
    public static void main(String args[]) 
    { 
     char[] search = "flow flow flow over me".toCharArray(); 
     char[] pattern = "flow".toCharArray(); 

     for(int i = 0; i <= search.length - pattern.length; i++) 
      // `-` don't go till the end of the search str. and overflow 
     { 
      boolean flag = true; 
      for(int j=0; j < pattern.length; j++) 
      { 
       if(search[i + j] != pattern[j]) 
       { 
        flag = false; 
        break; 
       } 
      } 
      if (flag) 
       System.out.println("Match found at " + i); 

     } 
    } 
} 
Смежные вопросы