平衡弦乐定期演奏

时间:2018-08-10 10:20:43

标签: java regex string expression balance

这是问题所在:
字符串仅由a,b,c,d组成。

如果满足以下条件,则认为该字符串是平衡的:

  1. a和c的总和是偶数
  2. b和d的出现之和是偶数

我必须编写一个正则表达式来检查字符串在Java中是否为平衡字符串。
请帮帮我。

3 个答案:

答案 0 :(得分:3)

如果您不使用正则表达式,而是使用Java库,则代码将更容易理解。 将 StringUtils 库与 countMatches() countOccurencesOf()方法一起使用。
添加依赖项:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.5</version>
</dependency>

Java代码:

String customString;   
int aCount = StringUtils.countMatches(customString, "a");
int bCount = StringUtils.countMatches(customString, "b");
int abSum = aCount + bCount;

// Check sum is even or odd.
if ( (abSum & 1) == 0 ) { even... } else { odd... }

答案 1 :(得分:2)

第一个条件。 ac的总和是偶数,这意味着您可以匹配acaacacc对。 / p>

使用正则表达式编写为

([ac]{2})*

由于ac中还有其他字符,因此它变为

(([^ac]*[ac]){2})*[^ac]*

第二个条件也一样

(([^bd]*[ac]){2})*[^bd]*

因为输入字符串应仅包含a,b,c,d,所以[^ac]应该是[bd][^bd]应该是[ac]

String cond1 = "(([bd]*[ac]){2})*[bd]*";
String cond2 = "(([ac]*[bd]){2})*[ac]*";
String input = "abcdabcd";
boolean matches = Pattern.matches(cond1, input) && Pattern.matches(cond2, input);

This question向我们展示了如何使用先行方式将这两个条件组合为一个正则表达式:

String regex = "(?=^(([ac]*[bd]){2})*[ac]*$)(([bd]*[ac]){2})*[bd]*";

答案 2 :(得分:1)

这是不使用超前行的解决方案。您可以绘制DFA,然后将其转换为正则表达式:-

String regex = (r'^(([ac]{2}|[bd]{2})|([ac][bd]|[bd][ac])([ac]{2}|[bd]{2})*([ac][bd]|[bd][ac]))*$')