【问题标题】:Brute force pattern search java蛮力模式搜索java
【发布时间】:2014-02-23 12:49:31
【问题描述】:

我一直在尝试编写一个子字符串搜索方法来计算字符串中出现的模式数量。我的问题必须处理我拥有的多个 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;
    }

【问题讨论】:

  • 我很好奇你为什么需要三个 for 循环。如果我没看错你的问题,可以用一个来完成。
  • @ChrisForrence 如果他不能使用substring 或比较字符串,那么我认为他需要两个循环,除非他首先设置DFA ......或者对他的索引做一些棘手的事情。
  • 我不想使用子字符串,因为我最终不得不使用其他通配符变量所以现在只是 for 循环

标签: java loops for-loop logic


【解决方案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; 是因为您已经发现了不匹配的问题,因此进行任何进一步的检查都是浪费时间。

【讨论】:

  • 这看起来像我想做的,我试试看
  • 看起来您的外部 for 循环比较不正确。
  • @SonalKhodiyar 我已经修复了,给您带来的不便敬请谅解。
【解决方案2】:

这将使您保持在一个 for 循环中,并进行健全性检查 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】:

    我知道这完全无视你的循环逻辑,但如果没有什么能阻止它,你为什么不使用正则表达式呢?

    类似这样的工作。一定要导入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

    【讨论】:

      【解决方案4】:
      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);
                   }
               }
      
      
           }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 2017-10-22
        • 1970-01-01
        • 2021-06-07
        • 2012-05-24
        • 2021-11-19
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多