【问题标题】:Java 8 Check if a string follows a b n patternJava 8 检查字符串是否遵循 b n 模式
【发布时间】:2020-04-14 06:24:39
【问题描述】:

我正在尝试做编码练习

给定一个字符串str,返回true字符串遵循模式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;     
} 

还有其他方法可以使用 Java 8 重构代码

任何帮助将不胜感激

【问题讨论】:

  • “还有另一种我们可以使用 Java 8 重构代码的方法吗?” - 很多。但是你为什么要这样做呢?你的目标是什么?
  • 我是 java 8 新手,需要在 java 8 中完成一些编码挑战
  • 您的代码是在 Java 8 中。不,它没有使用流或 Java 8 附带的任何其他简洁功能,但它仍然是完美的 Java 8。
  • 按字面意思理解“anbn”:if(s.length()%2 == 1) return false; int n = s.length() / 2; return s.matches("a{"+n+"}b{"+n+'}');
  • 我假设这个练习的重点是结合一些理论 CS 概念,更具体地说是自动机理论和形式语言理论。尽管已经提供了更实用的解决方案,但 CS 101 的方法是编写一个下推自动机。对于每个字符,如果遇到“a”,将其压入堆栈。如果遇到'b',则从堆栈中弹出。在字符串的末尾,如果您的堆栈为空,则您接受。

标签: java java-8


【解决方案1】:
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;

    }

【讨论】:

【解决方案2】:

你可以使用正则表达式:

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();
}

【讨论】:

    【解决方案3】:

    使用正则表达式是最简单的方法:

    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 行将使用 Java 8 流 API 查找字符串中 a 的出现次数。

    第 2 行将使用正则表达式来检查模式。

    【讨论】:

    • 写return s.matches(expr);比你的方式更简洁。 String::matches 委托给 Pattern::matches 所以结果是相同的
    【解决方案4】:

    使用正则表达式是最简单、最易读的解决方案。

    字符串的长度是否均匀?上半场都是As吗?下半场都是B吗?

    final int midPoint = s.length() / 2;
    return (s.length() % 2 == 0)
        && s.substring(0, midPoint).matches("a+")
        && s.substring(midPoint).matches("b+");
    

    + 表示 1 次或多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 2011-12-21
      • 2014-12-29
      • 2019-06-20
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多