【问题标题】:How to search a sub string in string如何在字符串中搜索子字符串
【发布时间】:2015-09-09 05:37:19
【问题描述】:

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

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 !!");

    }

}

这段代码有什么问题?

【问题讨论】:

  • 你能给我们举一些例子,说明什么有效,什么无效?

标签: java string search


【解决方案1】:

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

您无需遍历整个String。您可以使用string.indexOf(subString) 查找字符串中子字符串的索引,它将返回子字符串第一次出现的索引。如果您只想检查字符串是否包含子字符串,您可以使用string.contains(subString)

【讨论】:

  • 对不起,我忘了说我不想使用任何内置函数。
【解决方案2】:

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

逻辑:

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

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

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

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


回答

那么出了什么问题?

我希望你注意到 2),第一个要点你只是检查 str 的第一个字符是否等于 subStr 的第一个字符,如果它们不相等,那么你就断定它们不匹配,这是错误的。

考虑这个例子:

str = "气球"

subStr = "龙"

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

这是因为根据您的代码如果 'b' != 'l' 那么他们的不匹配,这是错误的。这实质上就是为什么您的代码不起作用。


您可以执行以下操作:

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

【讨论】:

    【解决方案3】:

    只有当子字符串是原始字符串的结尾时,您的代码才有效。这是因为您的代码在退出第一个 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;,如上面的注释行所示。

    另一个注意事项:不要倾向于在ifelse 语句中省略{}s。虽然从技术上讲,您对于单个语句不需要 它们,但如果您稍后需要编辑代码,它可能会导致错误...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 2022-01-23
      • 2014-04-27
      • 2021-04-25
      • 2011-07-04
      • 2023-04-03
      相关资源
      最近更新 更多