【问题标题】:Java loops: Write a program that returns number of occurrences of a string in another stringJava 循环:编写一个程序,返回一个字符串在另一个字符串中出现的次数
【发布时间】:2017-01-03 16:59:45
【问题描述】:

我正在尝试解决这个问题,但它似乎没有任何效果。我试图搜索问题,但所有其他答案都使用方法或数组,我们还没有研究过它们,所以我只能用循环来解决问题。这是问题:

编写一个程序,返回一个字符串在另一个字符串中出现的次数。
例如
输入:
第一个字符串:the
第二条:学生们在工程学院努力工作,因为他们喜欢它
输出:
3

这是我尝试过的:

    Scanner input = new Scanner(System.in); 
    String s1 = input.nextLine();
    String s2 = input.nextLine();
    int count = 0;

    String text="";

    for(int i = 0; i<s1.length(); i++){
        for(int j =0; j<=s2.length() ; j++){
            if(s1.charAt(i)==s2.charAt(j) && i ==0){
                for(int m=1; m<s1.length();m++){
                    if(s1.charAt(i+1)==s2.charAt(j+1)){
                        if(m==s1.length()){
                            count++;
                        }else{
                            break;
                        }
                    }
                }
            }
        }
    }

    System.out.println(count);

我认为我的逻辑有问题。这就是我的想法:程序应该检查第一个字符串的第一个字母,然后检查它是否检查它是否等于第二个字符串的第一个字母,然后如果它不等于它,那么程序应该循环遍历第二个字符串,直到它找到一个等于第一个字符串的第一个字母的字母,如果它找到一个等于第一个字符串的字母,它检查第一个字符串的第二个字母是否等于另一个字符串的下一个字母,如果是,那么它检查这是否是第一个字符串的最后一个字母,如果是,则计数增加一,如果不是,则循环下一个字符。我尝试通过其他几种方法来完成我的代码以外的工作。有人可以帮我解释一下逻辑吗?

【问题讨论】:

  • 你试过调试你的程序吗?因为那是你应该做的。
  • @f1sh 我不知道如何调试这是我学习编程的第一门课程,但是除非我运行它,否则我不会在代码中遇到任何错误,它会给出索引超出范围异常
  • 你做到了 O(n^2),你可以做到 O(n)
  • @maya91 这是另一个不使用数组的stackoverflow.com/a/6267655/7098259

标签: java string loops nested-loops


【解决方案1】:

程序应该检查第一个字符串的第一个字母,然后检查它是否等于第二个字符串的第一个字母,

好的

如果它不等于它,那么程序应该遍历第二个字符串,直到找到一个等于第一个字符串的第一个字母的字母,

如果这是您想要做的,那么遍历 s2 应该是您最外层循环的基础。但是您已经编写了遍历 s1 作为最外层循环。

如果它找到一个等于第一个字符串的字母,它检查第一个字符串的第二个字母是否等于另一个字符串的下一个字母,如果是,那么它检查那是否是第一个字符串的最后一个字母,如果是那么count 加一,如果不是,则循环下一个字符。

好的。所以你只需要一个索引到 s2 (外循环),一个索引到与 s1 的潜在匹配(内循环)。除此之外,您不需要另一个循环。

最后一点,请注意外部循环索引(遍历 s2)加上内部索引(遍历潜在匹配)的总和不超过 s2 的范围。正如你现在写的那样,它可以超过字符串长度,事实上确实如此。

String s1 = "the";
String s2 = "the students are working hard in the faculty of Engineering because they love it";
int count = 0;
assert(!s1.isEmpty());
int s2LastPositionOfPotentialMatch = s2.length() - s1.length();
for(int i = 0; i < s2LastPositionOfPotentialMatch + 1; i++){
    for(int j = 0; j < s1.length(); j++) {
        if(s1.charAt(j) != s2.charAt(i+j)) {
            break;
        } else if(j + 1 == s1.length()) {
            count++;
        }
    }
}
System.out.println(count);  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2011-07-01
    相关资源
    最近更新 更多