使用charAt在字符串中搜索子字符串

时间:2013-10-29 20:44:28

标签: java string search charat

CS学生在这里。像往常一样,我很困惑。我的任务是只使用.charAt()和.length()来搜索字符串中的子字符串(两者都由用户提供)。它应该返回的是字符串中子字符串的开始索引(如果根本不存在则为-1)。坦率地说,我不知道从哪里开始。我试图做类似以下的事情:

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

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

感谢阅读。

5 个答案:

答案 0 :(得分:1)

如果您只允许使用charAtlength方法,则需要嵌套for循环。为了不破坏你的锻炼,我会尽我所能让你开始不为你做。

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

我们在这里说的是对于字符串的每个索引,遍历子字符串的所有字符并执行某些操作。显然,你必须以某种方式比较角色。如果您通过整个子字符串并且字符匹配,那么您将要返回外部循环的计数,因为子字符串的起始位置。

如果你通过整个嵌套循环并且没有返回子字符串所在的索引,那么你想要返回-1。您在那里需要一个if语句来提供该逻辑。如果您需要帮助,请评论!

答案 1 :(得分:1)

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

我没有包含代码,因为这是一个家庭作业,但你应该没事。

答案 2 :(得分: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;
}

答案 3 :(得分: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;
                      }
                 }
      }

答案 4 :(得分:0)

很好的方法@rolfl。 为您的解决方案添加一小部分贡献: 当string等于substring时有一个小bug。它永远不会进入外环并且我们可以有string =“cat”和substring =“cat”所以indexOf应该是0。 修改outloop应该有效: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;
  }