我有一个像这样的字符串:PQqRrp
。大写字母后跟小写字母。
如果Upper后跟自己的小写字母,则匹配。所以我需要一直到最后一个匹配上部和下部字母的点。如果lower与其自己的匹配较低,则表示不匹配。
现在我需要找到我的角色匹配的最后位置(上面是低位字母)。在上述案例的第5位,r was matching with R
。
private int getStringMatchNumber(String input) {
char[] str = input.toLowerCase().toCharArray();
// now I am confuse
}
我该怎么办?
答案 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
以避免误报。