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

3
我想通过迭代检查字符串中是否存在某个模式。
这是我目前拥有的代码,但是结果一直为false。
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");
                }
            }
        }
    }

基本上,我想检查字符串abcdef中是否存在abc

注意:我不想使用正则表达式,因为太简单了。我正在尝试找到一种迭代的解决方案,因为我很好奇如何实现。


@Ramanlfc 因为正则表达式太简单了 :) 我正在尝试找到一种不使用它的解决方案,因为我很好奇如何通过迭代来实现。 - imbondbaby
使用String#contains怎么样? - Luiggi Mendoza
你在for循环中计数错误。你设置了i = patternArray.length - 1,这是2,然后你增加的时候2小于或等于2。这将在一次运行后终止。 - Jonas Lomholdt
3
你是希望找到所有的匹配,还是仅需一次匹配就可以了? - xrisk
@imbondbaby 如果你想在for循环中保留打印语句,那么对于我的解决方案有什么看法? - Enamul Hassan
5个回答

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

        }
    }
}

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

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

这是一个非常简单的算法。

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


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

您可以使用此解决方案迭代匹配项,如果您想循环所有匹配项。 编辑:语言已更改。

谁让你提供 Python 代码的?难道你没有看到问题中的标签“Java”吗?如果很容易将其转换为 Java,请发布您完成此简单任务的代码。谢谢。 - Enamul Hassan
他不问如何在Java中编写此代码,他问如何在不使用正则表达式的情况下解决问题。我已将代码更改为Java,希望没有语法错误。 - RockOnGom
如果 OP 在帖子中发布了 Java 代码,则应该在 Java 中进行修复,或者如果 OP 的标签中存在“Java”标签,则应编写一个 Java 程序。 - Enamul Hassan
如果我有机会的话,我会这样做。下一次我不会用不同的语言回答问题。 - RockOnGom
@RockOnGom 问题标签是Java,而不是Python。因此,标准是使用Java代码发布答案,而不是Python,C++,JavaScript,甚至不是运行在JVM上的Scala或其他语言。相反,您可以提供解决方案的伪代码,并说明您的“代码”实际上是伪代码,并且可以在所需的编程语言中实现,然后让社区投票,以确定是否解决了该问题。 - Luiggi Mendoza

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接