查找字符串匹配位置?

时间:2015-05-23 06:02:19

标签: java string char string-matching

我有一个像这样的字符串:PQqRrp。大写字母后跟小写字母。

如果Upper后跟自己的小写字母,则匹配。所以我需要一直到最后一个匹配上部和下部字母的点。如果lower与其自己的匹配较低,则表示不匹配。

现在我需要找到我的角色匹配的最后位置(上面是低位字母)。在上述案例的第5位,r was matching with R

private int getStringMatchNumber(String input) {
    char[] str = input.toLowerCase().toCharArray();
    // now I am confuse
}

我该怎么办?

3 个答案:

答案 0 :(得分:2)

你可以从字符串的结尾开始,然后以伪代码:

向后
getXyz

Java代码:

char[] str = input.toCharArray()
for i = str.length-1 down to 1:
   if str[i] is lowercase:
      if toLowerCase(str[i-1]) == str[i] and str[i-1] is uppercase:
         return i-1

return -1  // means no match is found

答案 1 :(得分:1)

其他答案(包括已接受的答案)不考虑外部匹配(例如AB中的A a - 应返回3,但其他解决方案返回2,因为它与A不匹配a)

这是一个粗略的综合解决方案:

private static int getStringMatchNumber(String input) {
    char[] str = input.toCharArray();

    int last = findMatches(str, 0);
    System.out.println("Last unmatched index: " + (last - 1));

    for(int i = str.length-1; i > 0; i--) {
        Character c = str[i];
        Character p = str[i-1];
        if (Character.isLowerCase(c) && Character.isUpperCase(p)){
            if (p == Character.toUpperCase(c))
                return i;
        }
    }
    return 0;
}

private static int findMatches(char[] str, int pos) {

    if(pos+1 >= str.length) {
        return pos;
    }
    Character c = str[pos];
    Character p = str[pos+1];
    int nextPos = 0;

    System.out.println(c + " " + p);

    if (Character.isUpperCase(c) && Character.isLowerCase(p)){
         if (c == Character.toUpperCase(p)) {
             System.out.println("Match found");
             pos = pos+2;
             pos = findMatches(str, pos);
         } else {
             System.out.println("Next lower case letter doesn't match. Stop.");
         }
    } else if(Character.isUpperCase(c) && Character.isUpperCase(p)) {
        System.out.println("Trying to find inner Matches first");

        nextPos = findMatches(str, pos+1);
        if(nextPos < str.length) {
            p = str[nextPos];
            System.out.println("Outer match character: " + p);
            System.out.println(c + " " + p);

            if ((Character.isUpperCase(c) && Character.isLowerCase(p)) && (c == Character.toUpperCase(p))){
                System.out.println("Outer Match found");
                pos = nextPos + 1;
            } else {
                pos = nextPos;
            }
        }
        if(pos < str.length) {
            pos = findMatches(str, pos);
        }
    } else {
        System.out.println("Lower case letter found, will return and find outer match");
    }

    return pos;
}

答案 2 :(得分:0)

您应该继续编写程序的伪代码。 从您发布的代码中,根据我的理解,您不需要将输入转换为小写。这会将所有内容都改为小写,你就不能使用这些值。

我会从字符数组的末尾运行一个for循环,并检查每个连续的值对是否相等。由于循环从末尾开始,匹配的第一个实例将返回值i。当你正在寻找最后一场比赛时,后退方法是有效的。该方法也只使用一个if条件,因此从长远来看会占用更少的内存。

private static int getStringMatchNumber(String input) {
    char[] str = input.toCharArray();
    for(int i = str.length-1; i > 0; i--) {
        Character c = str[i];
        Character p = str[i-1];
        if (Character.isLowerCase(c) && Character.isUpperCase(p)){
            if (p == Character.toUpperCase(c))
                return i;
        }
    }
    return 0;
}

请注意,如果函数返回0,则表示未找到匹配对。你可以在被叫方之后检查这个。

编辑我已在匹配项目中实施了小写和大写检查(按其他人的建议)。请注意,返回的值是匹配中较低的字符符号位置的zero-based值。对于输入值"aaaBbaa",返回值为4,即b匹配中Bb的位置。您可以通过返回B而不是i-1来调整算法以返回i的位置。在这种情况下,您需要返回-1而不是0以避免误报。