如何在字符串中搜索子字符串

时间:2015-09-09 05:37:20

标签: java string search

我尝试了这段代码,但这并不适用于所有字符串。

import java.util.Scanner;
public class Substring {

    public static void main(String[] args) {
        String str;
        String subStr;
        int count=0;
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the String : ");
        str = in.nextLine();
        System.out.println("Enter the Sub String : ");
        subStr = in.nextLine();

        for(int i =0 ; i <str.length(); i++)
        {
            if(str.charAt(i) == subStr.charAt(0))
            { 
                for(int j=0 ; j<subStr.length();j++)
                {
                    if( subStr.charAt(j) ==str.charAt(i+j))
                    count++;
                    else
                    {
                        count=0;
                        break;
                    }
                }
            }
        }

        if(count == subStr.length())
            System.out.println("Sub String Matched !!");
        else
            System.out.println("String does not match !!");

    }

}

这段代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

只有子字符串是原始字符串的末尾时,您的代码才有效。这是因为在退出第一个for循环之前,您的代码不会检查整个子字符串是否匹配。我在if (count == subStr.length() )循环中移动了for语句,如果找到子字符串,则添加break

import java.util.Scanner;
public class Substring {

public static void main(String[] args) {
    String str;
    String subStr;
    int count=0;
    Scanner in = new Scanner(System.in);
    System.out.println("Enter the String : ");
    str = in.nextLine();
    System.out.println("Enter the Sub String : ");
    subStr = in.nextLine();

    for(int i =0 ; i <str.length(); i++) {
        if(str.charAt(i) == subStr.charAt(0)) { 
            for(int j=0 ; j<subStr.length();j++) {
                if( subStr.charAt(j) ==str.charAt(i+j)) {
                    count++;
                } else {
                    count=0;
                    break;
                }
            }
            if(count == subStr.length()) {
                System.out.println("Sub String Matched !!");
                //int index = i;
                break;
            }
        }
    }
        if(count == 0){
            System.out.println("String does not match !!");
        }
}

}

注意:如果你想要发生子串(第一个)的索引,你可以在打破循环之前设置int index = i;,如上面的注释行所示。

另一个注意事项:不要忽略{}if语句中的else s。虽然从技术上讲,您不需要它们用于单个语句,但如果您以后需要编辑代码,则可能会导致错误...

答案 1 :(得分:0)

尝试破译代码背后的逻辑,所以简单地说,你的代码执行以下操作:

LOGIC:

1)通过扫描仪输入一个字符串并将其存储为str,对子字符串执行相同操作并将其存储为subStr。

2)通过for循环遍历str的每个字符。

  • 如果subStr的第一个字符等于str中的任何字符,则循环遍历subStr的字符。如果超出此索引的字符相等,则每次每个字符串中的字母在以下索引处相等时,递增count变量。
  • 其他打印字符串不匹配。

3)如果两个字符串中的相似字符数(由count变量表示)等于subString的长度,则匹配subString。否则不配。

ANSWER

那出了什么问题?

我希望你注意到2),第一个要点你只是检查str的第一个字符是否等于subStr的第一个字符,如果它们不相等你就得出结论它们是不匹配的,这是假的。

考虑一下这个例子:

str =“baloon”

subStr =“loon”

您的输出将是:“字符串不匹配”

这是因为根据你的代码,如果'b'!='l'那么他们的匹配就没有了,这是假的。这实际上就是你的代码不起作用的原因。

您可以完成以下操作:

    if(str.contains(subStr)){
                  System.out.println("Sub-string matched");
                  }