我想编写一个简单的类来处理字符串(可能是很长的字符串,最多可以包含100万个字符)。字符串基本上由两个可以相互混合的字符“ a”和“ b”组成。如果a的个数等于b的个数,则应用会说可以,否则为NOK。我想知道如何最有效地做到这一点。我考虑过使用正则表达式拆分String,然后计算a和b的出现次数,但也许有人知道更好的方法。对于regex来说还比较陌生,所以请让我知道是否有任何错误。这是我的早期尝试。
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); } }
为什么需要正则表达式并为此拆分字符串!您可以简单地遍历字符串并计算a和bs的数量。您需要保留两个不同的计数器,一个代表a,另一个代表b。使用正则表达式会降低效率。如果没有至少遍历字符串一次,就无法获得结果。因此,使用一个简单的循环来计算a和b。
您可以在循环中进行一次优化。如果任何时间的mod of countA - countB大于剩余字符数,则a和b永远不能相等。这样就可以打破循环了。
countA - countB
如果字符串的长度为奇数,则无需计数。当元素总数为奇数时,a和b的计数永远不能相等。