如何构造正则表达式来平衡字符串中的字符?

时间:2017-06-12 09:10:43

标签: java regex string balance

我遇到了不同问题的正则表达式,但我找不到正则表达式来平衡字符串中的字符。

我遇到了一个问题,找出一个字符串是否平衡。 例如:aabbccdd是平衡的,因为字符以偶数重复 但是aabbccddd不是平衡的,因为ddd在奇数模式下重复。这适用于所有字符都不提供特定a,b,c and d的输入。如果我将输入设为12344321123454321,则应分别返回平衡和不平衡结果。

如何使用正则表达式查找余额。我们应该使用什么类型的正则表达式来查找字符串是否平衡?

Edit:

我试图仅使用正则表达式找到解决方案,因为问题需要以正则表达式模式回答。如果没有明确提到正则表达式,我会使用任何其他解决方案实现

2 个答案:

答案 0 :(得分:1)

我认为你不能用正则表达式做到这一点。你为什么需要使用它们? 我试过这个:它有效,而且非常简单

static boolean isBalanced(String str) {
    ArrayList<Character> odds = new ArrayList<>(); //Will contain the characters read until now an odd number of times
    for (char x : str.toCharArray()) { //Reads each char of the string
        if (odds.contains(x)) { //If x was in the arraylist we found x an even number of times so let's remove it
            odds.remove(odds.indexOf(x));
        }
        else {
            odds.add(x);
        }
    }
    return odds.isEmpty();
}

答案 1 :(得分:1)

存在这个问题的正则表达式,但不会加速任何事情并且会完全混乱。准备NFA更容易,然后切换到REGEX。不过,这不是合适的工具。

public static void main(String args[]) {
    String s = args[0];
    int[] counter = new int[256];
    for (int i = 0; i < s.length(); i++) {
        counter[s.charAt(i)]++;
    }
    if (validate(counter)) {
        System.out.println("valid");
    } else {
        System.out.println("invalid");
    }
}

public static boolean validate(int[] tab) {
    for (int i : tab) {
        if (i%2 == 1) {
            return false;
        }
    }
    return true;
}

编辑: 指出正则表达式存在

仅限两个字符的有限自动化参考。从左边开始,用双圈赢。每个状态由到目前为止具有奇数的字符集命名。

enter image description here