我如何搜索字符串或第一次出现一个子字符串?

时间:2015-05-04 00:42:06

标签: java

例如,搜索字符串“aabacbba”for the substring“a”would return the index of 3`:

private int findString(String str, int start) {
   // TODO: Implement string search
}

我不确定如何检查以确保字符串是单独的并重复。

4 个答案:

答案 0 :(得分:0)

以下是一些可以帮助您的事情:

字符串具有s.charAt(i);方法,该方法返回给定索引处的字符。

String还有一个length()方法,可以返回它拥有的字符数量。

您可以使用for循环检查每个字符,看它是否与您想要的字符匹配。

for(int i = 0; i < line.length(); i++)

答案 1 :(得分:0)

使用substring()indexOf()可以轻松实现

public static void main(String[] args) throws Exception {
    String testString = "aabacbba";
    System.out.println(findString(testString, 2, "c"));
}

private static int findString(String stringToSearch, int start, String stringToFind) {
    int index = stringToSearch.substring(start).indexOf(stringToFind);

    // Add start to the result of indexOf to have the actual index in the original string
    // It'll return a -1 if no result is found
    return index > -1 ? index + start : index;        
}

结果:

  

findString(testString,2,&#34; a&#34;)=&gt;返回3

     

findString(testString,2,&#34; c&#34;)=&gt;返回4

     

findString(testString,2,&#34; d&#34;)=&gt;返回-1

     

findString(testString,1,&#34; bb&#34;)=&gt;返回5

更新

在阅读关于检查以确保该字符在起始位置后出现一次的评论后,我已做出更新答案。

public static void main(String[] args) throws Exception {
    String testString = "aabacbba";
    System.out.println(findString(testString, 3, "b"));
}

private static int findString(String stringToSearch, int start, String stringToFind) {
    int index = stringToSearch.substring(start).indexOf(stringToFind);

    // Check the next character to make sure it's a single occurrence
    if (index > -1 && stringToSearch.charAt(index + start + 1) == stringToFind.charAt(0)) {
        index = -1;
    }

    // Add start to the result of indexOf to have the actual index in the original string
    // It'll return a -1 if no result is found
    return index > -1 ? index + start : index;
}

结果:

  

findString(testString,3,&#34; b&#34;)=&gt;返回-1,因为b重复

     

findString(testString,2,&#34; a&#34;)=&gt;返回3

     

findString(testString,2,&#34; c&#34;)=&gt;返回4

答案 2 :(得分:0)

我相信你会发现,对于一个角色,你将在第一个位置找到不重复的东西。我的理解是否正确?

一个简单的方法是使用正则表达式找出这样的字符。

e.g。

使用正则表达式+拆分

更短但更难处理
int position = "aabacbba".split("(?<!a)a(?!a)")[0].length();

或正确使用匹配器:

Matcher m = Pattern.compile("(?<!a)a(?!a)").matcher("aabacbba");
m.find();
int position = m.start();

两者都会给你3

然而,使用String.chatAt(i)用一点逻辑来找出它并不困难

伪造的代码

for (int i = 0; i < inputString.length; ++i) {
    if (inputString[i] == charToFind
        && inputString[i-1] != charToFind
        && inputString[i+1] != chatToFind) {
        return i;
    }
}
return -1;

让你自己解决一个小陷阱:inputString[i-1]inputString[i+1]可以超越界限。它应该很容易自己解决。

答案 3 :(得分:0)

这应该有效:

private static int findString(String sub, String str, int start) {
    boolean isolated = true;
    int i = str.indexOf(sub, start);
    while (i >= 0) {
        int end = i + sub.length();
        int next = str.indexOf(sub, end);
        if (next < 0 || isolated && next > end) {
            break;
        }
        isolated = next > end;
        i = next;
    }
    return isolated ? i : -1;
}
相关问题