蛮力模式搜索java

Posted

技术标签:

【中文标题】蛮力模式搜索java【英文标题】:Brute force pattern search 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 循环 【参考方案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);
             
         


     


【讨论】:

以上是关于蛮力模式搜索java的主要内容,如果未能解决你的问题,请参考以下文章

运行蛮力算法出错?

算法笔记_009:字符串匹配蛮力法

Java indexOf(蛮力方法)对我或其他一些子字符串算法更实用吗?

字符串匹配与KMP算法笔记

java 501.在二进制搜索Tree.java中查找模式

java 501.在二进制搜索Tree.java中查找模式