如何检查一串字母是否按顺序出现在字符串中?

时间:2015-04-16 09:19:58

标签: java string

我正在研究一种方法,该方法以小写字母的形式获取字符串和三个字母的数组作为输入。

该方法应该找到以第一个字母开头的单词,并按插入顺序包含其他两个字母。

如果插入两次字母,它应该在单词中出现两次。

例如,expected一词是(e,e,e)的合法用语,但seemed这个词不合法。

使用我的以下代码,我可以获得任何合法的输入,这是错误的。

    public static void printWords(String[] vocabulary,
        String firstLetter, String secondLetter, String thirdLetter){

    int counter=0;
    for (String str : vocabulary){
        int index1=0;
        int index2=0;
        String newstr=str;

        if (((str.substring(0,1).equals(firstLetter)))){
        newstr=str.substring(1, str.length());
        if (newstr.contains(secondLetter)){
            index1=str.indexOf(secondLetter);
            newstr=str.substring(index2, str.length());
        }
        if (newstr.contains(thirdLetter)){
            index2=str.indexOf(thirdLetter);

        }

        }
        if (index2>index1)
        {
            counter++;
            System.out.println(str);
        }

    }
    System.out.println("found "+ counter+" words");

}

2 个答案:

答案 0 :(得分:3)

使用正则表达式实现起来要容易得多:

boolean matches(String word, String letter1, String letter2, String letter3) throws IllegalArgumentException {

    String[] s = new String[] {letter1, letter2, letter3};

    for (String l : s) {
        if (l.length() != 1)
            throw new IllegalArgumentException("Wrong input, only 1-char strings are allowed!");
        if (l < "a" || l > "z")
            throw new IllegalArgumentException("Wrong input, only lowercase latin letters are allowed!");
    }   

    Pattern regex = Pattern.compile(s[0] + ".*" + s[1] + ".*" + s[2] + ".*");

    // will produce a regex like "a.*b.*c.*"

    return regex.matcher(word).matches();
}

答案 1 :(得分:3)

如果你严格地谈论给定的代码(虽然正则表达式或其他一些方式更优雅和更好的解决方案)应该是:

if (((str.substring(0,1).equals(firstLetter)))){
    newstr=str.substring(1, str.length());
    if (newstr.contains(secondLetter)){
        index1=newstr.indexOf(secondLetter) + 1;
        newstr=str.substring(index1 + 1, str.length());
    }
    if (newstr.contains(thirdLetter)){
        index2=newstr.indexOf(thirdLetter) + index1 + 1;

    }
    ....