Java8检查字符串是否遵循BN模式
我正在努力做编码练习 给定一个字符串str,返回真字符串遵循模式anbn,也就是说,它后面有a,后面跟着b,这样a和b的数目是相同的 输入:str=aabb 输出:是 输入:str=abab 输出:否 输入:str=aabbb 输出:否 我已经完成了以下代码Java8检查字符串是否遵循BN模式,java,java-8,Java,Java 8,我正在努力做编码练习 给定一个字符串str,返回真字符串遵循模式anbn,也就是说,它后面有a,后面跟着b,这样a和b的数目是相同的 输入:str=aabb 输出:是 输入:str=abab 输出:否 输入:str=aabbb 输出:否 我已经完成了以下代码 public static boolean isAnBn(String s) { int l = s.length(); // Only even length strings will have same numb
public static boolean isAnBn(String s)
{
int l = s.length();
// Only even length strings will have same number of a's and b's
if (l%2 == 1)
{
return false;
}
// Set two pointers, one from the left and another from right
int i = 0;
int j = l-1;
// Compare the characters till the center
while (i<j)
{
if(s.charAt(i) != 'a' || s.charAt(j) != 'b')
{
return false;
}
i++;
j--;
}
return true;
}
是否有其他方法可以使用Java8重构代码
任何帮助都将不胜感激使用正则表达式是最简单、可读性最强的解决方案
public static boolean isAnBn(String s)
{
Map<Character, Integer> freqs = new HashMap<>();
for (char c : s.toCharArray()) {
freqs.merge(c, // key = char
1, // value to merge
Integer::sum); // counting
}
if(freqs.get('a') == freqs.get('b') )
return true;
return false;
}
绳子的长度均匀吗?上半场是不是都一样?下半场全是B吗
final int midPoint = s.length() / 2;
return (s.length() % 2 == 0)
&& s.substring(0, midPoint).matches("a+")
&& s.substring(midPoint).matches("b+");
+表示一次或多次。您可以使用正则表达式:
public static boolean isAnBn(final String str){
//cannot be on pattern if not an even length of str
if (str == null || str.length() % 2 != 0){
return false;
}
final String aHalf = str.substring(0,str.length()/2);
final Boolean isAs = isMatch(aHalf, "^[a]+$");
final String bHalf = str.substring(str.length()/2);
final Boolean isBs = isMatch(bHalf, "^[b]+$");
return isAs && isBs;
}
private static Boolean isMatch(final String string, final String regex) {
final Pattern pattern = Pattern.compile(regex);
return pattern.matcher(string).matches();
}
使用正则表达式是最简单的方法:
public static boolean isAnBn(String s)
{
int aCount = (int) s.chars().filter(ch -> ch =='a').count();//Line 1
return Pattern.matches("a{"+aCount+"}b{"+aCount+"}", s);// Line 2
}
说明:
第1行将使用Java8流API查找字符串中a的出现次数
第2行将使用正则表达式检查模式 是否有其他方法可以使用Java8-6重构代码。但你为什么要这么做?你的目标是什么?我不熟悉java 8,在java 8中需要一些编码挑战。你的代码在java 8中。不,它没有使用流或Java8附带的任何其他简洁功能,但它仍然是非常好的Java8;int n=标准长度/2;返回s.matchesa{+n+}b{+n+'}';我假设这个练习的重点是结合一些理论上的CS概念,更具体地说是自动机理论和形式语言理论。尽管已经提供了更多实用的解决方案,但CS 101方法将是编写下推自动机。对于每个字符,如果遇到“a”,请将其推到堆栈上。如果遇到“b”,则从堆栈中弹出。在字符串的末尾,如果堆栈为空,则接受。将装箱整数与==哪个进行比较。更简洁的编写方法是返回s.matchesexpr;比你的方式。String::将委托与Pattern::matches匹配,因此结果相同