蛮力模式搜索java

时间:2014-01-30 23:30:27

标签: java loops for-loop logic

我一直在尝试编写子字符串搜索方法,该方法可以获取字符串中显示的模式数量。我的问题必须处理我所拥有的多个for循环和if语句的逻辑。如果输入字符串是AABABAA并且输入模式是AA,它应该迭代并返回2的数量。任何建议来帮助我完成我的代码?

public int getCount(String pattern){

for (int i=0; i< this.strand.length()-pattern.length(); i++){
    for (int k=0; k<pattern.length(); k++){
        if (this.strand.charAt(i) == pattern.charAt(k)){
                for(int j=1; j<pattern.length()-1; j++){
                    if (this.strand.charAt(j+i) == pattern.charAt(j)){
                        if(j==pattern.length()){
                            Count++;
                        }
                }
                    else{
                        break;
                    }
                }
        }

        else if (this.strand.charAt(i)!=pattern.charAt(k)){
            break;
        }
    }
}
        return Count;
    }

4 个答案:

答案 0 :(得分:1)

这样的东西?如果您不想使用.subString(int, int)

public static int findSubString(String input, String pattern) {
    int output = 0;
    for (int i = 0; i <= input.length() - pattern.length(); i++) {
        boolean ok = true;
        for (int k = 0; k < pattern.length(); k++) {
            if(input.charAt(i + k) != pattern.charAt(k)) {
                ok = false;
                break;
            }
        }
        if(ok) output++;
    }
    return output;
}

我认为如果pattern的长度大于input的长度,这也会有效。我使用break;因为您已经发现不匹配,所以进行任何进一步检查都是浪费时间。

答案 1 :(得分:0)

我知道这完全忽略了循环的逻辑,但如果没有什么可以阻止它,为什么不使用正则表达式呢?

这样的事情有效。请务必导入java.util.regex.*

调用getCount("AABABAA","AA")会返回2

public int getCount(String input, String expression) {
    Pattern pattern = Pattern.compile(expression);
    Matcher matcher = pattern.matcher(input);

    int count = 0;
    while (matcher.find())
        count++;

    return count;
}

请注意,根据您的表达式,您可能需要将其转义。从这个问题开始,如果是这样的话:How to escape text for regular expression in Java

答案 2 :(得分:0)

这会让您保持一个循环,以及完整性检查patternthis.strand

public int getCount(String pattern) {
    int count = 0;

    // Sanity check; make sure neither pattern nor strand are null
    if(pattern == null
            || this.strand == null
            || pattern.length() > this.strand.length()) {
        return count;
    }

    String _substring;
    for(int i = 0; i <= this.strand.length() - pattern.length(); i++) {
        _substring = this.strand.substring(i, i + pattern.length());
        if(_substring.equals(pattern)) {
            count++;
        }
    }
    return count;
}

答案 3 :(得分:0)

import java.util.Scanner;


public class StringMatch1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner in = new Scanner(System.in);
        String T, P, sub;

        System.out.print("Enter a text string T: ");
         T = in.nextLine();
         System.out.print("Enter a pattern string P: ");
         P = in.next();

         for (int i = 0; i <= T.length() - P.length(); i++ ){

             sub = T.substring(i, i + P.length()); // try to match this

             if (P.equals(sub)){
                 System.out.println("Found pattern at position " + i);
             }
         }


     }

}