字符串中的子串数

时间:2010-11-08 07:04:16

标签: java string

我的程序应该执行以下操作:

  1. 用户输入字符串:科迪勒拉斯大学
  2. 用户输入子字符串:er
  3. 程序输出子字符串数:2(大道
  4. 我不应该使用.str,而是创建我自己的方法。

7 个答案:

答案 0 :(得分:1)

天真的方法(检查每个可能索引处的子字符串)在 O(nk)中运行,其中 n 是字符串的长度, k 是子串的长度。这可以通过for循环实现,类似haystack.substring(i).startsWith(needle)

虽然存在更高效的算法。您可能需要查看Knuth-Morris-Pratt algorithmAho-Corasick algorithm。与天真的方法相反,这两种算法在输入方面也表现良好,例如“在10000'X的字符串中查找100'X'的子字符串。

答案 1 :(得分:1)

只需替换第一个匹配项并计数,直到没有。

int count = 0;
while (str.indexOf(subStr)>-1){
    str = str.replaceFirst(subStr, "");
    count++;
}
return count ;

答案 2 :(得分:0)

  1. String是一系列char值(如数组)
  2. 循环遍历此序列以及每个字符(示例中的最后一个除外):
    1. 测试,如果字符等于模式的第一个字符,并且下一个字符等于模式的第二个字符(如果你有,则适应不同大小的图案)
    2. 如果测试结果为true,请递增计数器。
  3. 这是基本算法。如果你已经启动并运行,请考虑特殊情况,例如源字符串为空或比模式更短。

答案 3 :(得分:0)

这是我的代码......

 import java.util.Scanner;
public class occurrenceOf_Substring {

public static void main(String[] args) {


    Scanner input=new Scanner(System.in);

    System.out.println(" Enter a string");

    String str=input.nextLine();

    System.out.println(" Enter a substring");       

    String substring=input.nextLine();

    int l=substring.length();



        int count=0;      
        int index=str.indexOf(substring); // To find first occurrence


        while(index<str.length() && index != -1) 
        {
            index=str.indexOf(substring,index+l);/// to find next occurrences 

            count=count+1;
        }


    System.out.println("substrin count is    "+count);
} }

答案 4 :(得分:0)

算法:

第1步:将mainstring转换为字符数组

第2步:将子字符串转换为字符数组

步骤3:逐个字符地比较两个数组

步骤4:如果子串数组中的至少一个字符与mainstring字符数组不匹配,则从子字符串的第一个字符开始,但继续在主字符串中移动

步骤5:如果子串的所有字符都匹配,则递增计数并再次从子串的第一个位置开始。

  import java.io.*;
  import java.util.Scanner;
  public class SubStringCount {

public static void main(String[] args) throws IOException {


    Scanner input=new Scanner(System.in);
    System.out.println("Enter you Main string:");
    String mainstring=input.nextLine();
    System.out.println("Enter the substring");
    String substring=input.nextLine();
    int i=0;int j=0;
    char[] str=mainstring.toCharArray(); // converting main string to character array
    char[] sub=substring.toCharArray(); // converting substring to character array
    int count=0;
    while(i<str.length)
    {
        if(str[i]==sub[j])
        {
                  j++;
        }
        else
        {
            j=0; 
        }
        if(j==sub.length)
        {
            j=0;
            count++;
        }
        i++;

    }

答案 5 :(得分:0)

在一行中:

int count = (str.length() - str.replace(subStr, "").length()) / subStr.length();

答案 6 :(得分:-1)

另一种可能是:使用split("sep", -1),则数组长度为(-1)。

示例:

String input    = "@human@mail@@com@";
String search   = "@";
int occurrences = input.split(search, -1).length - 1;

说明: split用给定的分隔符(regex)分隔输入字符串。因此,它返回一个带有分隔符之间的子字符串的数组。第二个参数-1告诉split不以任何方式限制数组长度。如果将split与默认限制(0)一起使用,则尾随的空字符串将被丢弃(如果要搜索的字符串位于末尾,则->错误的结果)。因此,为了最终获得搜索字符串的出现次数,必须将数组长度减少1。