Java8检查字符串是否遵循BN模式

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

我正在努力做编码练习

给定一个字符串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 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匹配,因此结果相同