1

CS学生在这里。像往常一样,我很困惑。我的任务是仅使用 .charAt() 和 .length() 在字符串中搜索子字符串(均由用户提供)。它应该返回的是字符串中子字符串的开始索引(如果根本不存在,则返回 -1)。坦率地说,我不知道从哪里开始。我尝试执行以下操作:

for (int i=0;i<string.length();i++)
    if (string.charAt(i) == substring.charAt(i))

如果这是真的,那么我想做一些事情,比如比较相应字符串中的下两个字符。我在这里离基地很远吗?关于如何离开地面的任何建议?

谢谢阅读。

4

5 回答 5

1

如果只允许使用charAtandlength方法,您将需要一个嵌套的 for 循环。为了不破坏你的练习,我会尽我所能让你开始而不是为你做。

for(int i = 0; i < string.length(); i++)
    for(int j = 0; j < substring.length(); j++)

我们在这里所说的是字符串的每个索引,遍历子字符串的所有字符并做一些事情。显然,您将不得不以某种方式比较角色。如果您通过整个子字符串并且字符匹配,您将希望返回外部循环的计数,因为这是子字符串开始的地方。

如果你完成了整个嵌套循环并且没有返回子字符串所在位置的索引,你会想要返回 -1。你需要一个if声明来提供这个逻辑。如果您需要帮助,请发表评论!

于 2013-10-29T20:52:06.187 回答
1

如果您只是希望做一个简单的解决方案,那么您需要做的就是设置两个循环。一个 for 循环遍历字符串的位置,如果您将子字符串的开始字符与字符串中的字符匹配,则可以使用内部 while 循环遍历查询和主字符串。您需要做的就是检查以确保您没有超出主字符串,这可以通过适当的 for 循环索引来完成。在内部 while 循环中,您可以使用外部循环计数器和内部循环计数器的组合来进行必要的比较。

我没有包含代码,因为这是一项家庭作业,但是从这里你应该没问题。

于 2013-10-29T20:52:27.220 回答
1

未经测试:

private static final int indexOf(String string, String substring) {
    outerloop: for (int i = 0; i < string.length() - substring.length(); i++) {
        for (int j = 0; j < substring.length(); j++) {
            if (substring.charAt(j) != string.charAt(i + j)) {
                continue outerloop;
            }
        }
        return i;
    }
    return -1;
}
于 2013-10-29T20:52:49.603 回答
1

也许这样的东西可以工作,我现在不能测试它,但我认为这不是一个坏主意。

   for (int i=0;i<string.length();i++){
                if (string.charAt(i) == substring.charAt(i)){
                      int j = i+1;
                      int l =0;
                      while (l<substring.lenght && string.charAt(j) == substring.charAt(l)){
                               j++;i++;
                      } if (l=substring.lenght){
                             return i;
                      }
                 }
      }
于 2013-10-29T20:55:38.893 回答
0

不错的方法@rolfl。为您的解决方案添加一个小贡献:当字符串等于子字符串时有一个小错误。它永远不会进入外循环,我们可以有 string="cat" 和 substring="cat" 所以 indexOf 应该是 0。修改外循环应该可以工作:i < s1.length() - (substring.length()-1)

  @Test
  public void test_firstSubstring(){
    String s = "cat";
    String p = "cat";

    int actual = findFirstSubstring(s,p);
    assertEquals(0,actual);
  }

public static int findFirstSubstring(String s1, String substring){
    if(s1.isEmpty() || substring.isEmpty() || substring.length() > s1.length()){ 
        return -1;
    }

    outloop: for (int i = 0; i < s1.length() - (substring.length()-1) ; i++){
        for (int j=0; j < substring.length(); j++){
                if (s1.charAt(i+j) != substring.charAt(j)) {
                    continue outloop;
                }
            }
            return i;
    }
    return -1;
  }
于 2015-01-23T21:32:59.000 回答