检查字符串中是否存在模式

Check if pattern exists in a String

我想使用迭代检查字符串中是否存在模式。

这是我目前拥有的,但我因此不断出错。

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

注意:我不想使用正则表达式,因为它太简单了。我试图找到一个没有它的解决方案,因为我很好奇如何通过迭代来解决这个问题。

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;
}

这是一个非常简单的算法

基本上,您从头开始遍历字符串并检查模式中的所有字母是否都等于该特定索引处的字母。

为什么不是这个:

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");
        }
    }
}

如果你想得到所有的匹配,我用一个列表来保存字符串中的匹配地址。

    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;
    }

如果您想使用此解决方案循环所有匹配项,您可以迭代匹配项。 Edit:language 改变了

问题是每个数组都有两个循环。在这里,您需要使用相同的索引在两个数组中遍历单个循环。

这是一个简单的字符串匹配程序,它将找到模式的所有匹配项。

由于 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);

        }
    }
}