java中的简单字符串匹配

时间:2014-01-04 12:59:37

标签: java

我正在尝试实现简单的字符串匹配。如果 source String包含 pattern String,则算法应返回1。我无法理解为什么它在以下输入上返回-1

    String source = "aababba";
    String pattern = "abba";

这是我的实施:

public static int findMatch(String source, String pattern)
{
    int j = 0,  pos = -1;
    boolean matched = false;

    if(source.length() < pattern.length())
        return -1;


    for(int i = 0; i < (source.length() - pattern.length()); i++)
    {
        if(source.charAt(i) == pattern.charAt(j))
            j++;
        else
            j = 0;
        if(j == pattern.length())
        {
            matched = true;
            break;
        }           
    }

    if(matched)
        return 1;       
    return -1;  
}   

修改 正如你们许多人所说,罪魁祸首是for循环。 我应该如下所示。其余的代码是一样的。其他解决方案也可以如答案中所示。

for(int i = 0; i <= (source.length() - pattern.length()); i++)
    {
        if(source.charAt(i+j) == pattern.charAt(j))
        {

7 个答案:

答案 0 :(得分:6)

您只检查三个字符

source.length() - pattern.length()

所以j永远不会等于pattern.length。您需要检查整个source

for(int i = 0; i < source.length(); i++)
{
  if(source.charAt(i) == pattern.charAt(j))
  ...
}

关于解决方案

for(int i = 0; i <= (source.length() - pattern.length()); i++)
    {
        if(source.charAt(i+j) == pattern.charAt(j))
        {

为什么有一个额外的减法和加法以及更复杂的代码,只需逐步浏览源代码?

答案 1 :(得分:2)

问题的根源是您已将i变量的上限限制为(source.length() - pattern.length())。您编写的for循环无法检查source字符串的所有字符,因此即使对于可以找到匹配项的一些字符串对,它也会返回-1。
解决方案:像这样重写for循环:

for(int i = 0; i < source.length(); i++)

答案 2 :(得分:1)

源的长度为7.模式的长度为4.对于i&gt;,您的语句i < (source.length() - pattern.length()将不为真。 2所以循环只是不够“远”。

答案 3 :(得分:1)

您可以轻松使用String.contains方法检查字符串是否包含模式。

答案 4 :(得分:1)

我想你已经知道它返回错误的原因了。你可以试试这个:

j = 0;
while(j <= (source.length() - pattern.length())){

    for (i = pattern.length(); i >= 0 && pattern[i] == source[i + j]; --i);

    if (i < 0)) {
        matched = true;
        break;
    }
    else j++;
}
关于字符串匹配,有很多方法,可以使用KMP,BM和Sunday等,性能比较是:KMP&lt; BM&lt;星期天,你可以尝试这些,他们非常有用。

答案 5 :(得分:0)

通过使用此语句(source.length() - pattern.length()),您只在源的三个第一个字符串上循环字符串。所以我永远找不到整个模式。

尝试使用pattern.length(),或者更好地尝试计算pattern.length()source.length()的最小值

答案 6 :(得分:0)

我认为它应该返回1,因为"aababba"最后包含"abba"

这将从您的编辑(解决方案)返回1

for(int i = 0; i <= (source.length() - pattern.length()); i++) {
    if(source.charAt(i+j) == pattern.charAt(j)) {

但是根据我的假设,你应该查看source中的每一封信,以便我使用:

for(int i = 0; i < source.length(); i++) {
    if(source.charAt(i) == pattern.charAt(j)) {

因为为什么要忽略最后一串字符?

但也许我只是假设你想要你的算法做错了,因为根据我的假设,你可以使用:

if (source.contains(pattern))
    return 1;
else
    return -1;