我想编写一个简单的类来处理字符串(可能是非常长的字符串,最多可达1mil字符)。字符串基本上由两个字符“a”和“b”组成,它们可以相互混合。如果一个相同数量的b的数量然后app会说它没关系,否则NOK。我想知道如何最有效地做到这一点。我想过使用正则表达式来分割字符串,然后计算一个和那个的出现,但也许有人知道更好的方法。对于正则表达式来说相对较新,所以如果有任何错误,请告诉我。这是我早期的尝试。
public class Typo {
public static void main(String[] args){
String ver = "";
int na = 0;
int nb = 0;
String regex = ("\\w.+");
Pattern p = Pattern.compile(regex);
String text = "ababababbaba";
if (text.length() == 0){
ver = "OK";
}
else if (text.length() == 1){
ver = "NOK";
}
else if ((text.length() % 2) == 1){
ver = "NOK";
}
else if ((text.length() % 2) == 0){
//check number of a and b and if it equals return OK otherwise NOK
Matcher m1 = p.matcher("a");
while(m1.find()){
na = na + 1;
}
Matcher m2 = p.matcher("b");
while(m2.find()){
nb = nb + 1;
}
if (na == nb){
ver = "OK";
}
else
ver = "NOK";
}
System.out.println(ver);
}
}
答案 0 :(得分:3)
为什么需要正则表达式并为此分割字符串!您可以简单地遍历字符串并计算a和bs的数量。你需要保留两个不同的计数器,一个用于a,一个用于b。使用正则表达式效率会降低。如果没有遍历字符串至少一次就无法获得结果。因此,使用一个简单的循环来计算a和b。
您可以在循环中进行一次优化。如果任何时候countA - countB
的mod大于剩余字符数,则a和b永远不能相等。所以你可以打破循环。
如果字符串的长度是奇数,则无需计数。当元素总数为奇数时,a和b的计数永远不能相等。
答案 1 :(得分:1)
你绝对不应该使用正则表达式解决这个问题:一般来说,当你需要计算任何东西时,正则表达式并不好。你甚至不能编写正则表达式来检查表达式中的括号是否平衡。
对于这个问题,一个简单的计数器就足够了:a
上的增量,b
上的减量,最后检查零以了解问题的答案。
boolean check(String s) {
int count = 0;
for (int i = 0 ; i != s.length() ; i++) {
if (s.charAt(i) == 'a') {
count++;
} else { /* it is b */
count--;
}
}
return count == 0;
}
答案 2 :(得分:1)
我相信这就是你想要的:
private static boolean check(String input) {
int count = 0;
for (int i = 0; i < input.length(); ++i) {
if (input.charAt(i) == 'a') {
count++;
}
}
return count == input.length() >> 1; // count == input.length()/2
}
答案 3 :(得分:1)
如果您愿意,可以使用StringUtils之类的第三方库。它有一个方法countMatches,可以完成这项工作。
StringUtils.countMatches("abba", "a") = 2
StringUtils.countMatches("abba", "ab") = 1
答案 4 :(得分:1)
使用简单的东西有什么问题?你做这么简单的事情的想法是一种过度的,最终会使用更多的资源。
String s = "abbb";
int a = 0;
int b = 0;
for(int i = 0; i<s.length(); i++){
if((s.charAt(i) == 'a')){
a += 1;
} else {
b += 1;
}
}
a = 1; b = 3
答案 5 :(得分:1)
public class Typo {
public static void main(String[] args){
String ver = "NOK";
String text = "ababababbaba";
if( (text.length() - text.replaceAll("a","").length() ) ==
( text.length() - text.replaceAll("b","").length() ) ) {
ver = "OK";
}
System.out.println(ver);
}
}