2

我正在尝试将一个字符串与另一个字符串匹配,以使两者之间至少有 3 个字符匹配。我的字符串的长度应为 4,全部大写,3 个字母和 1 个介于 0 和 10 之间的数字(不包括 0 和 10)。例如:RM5Z 我怎样才能以最简化的形式在 java 中做到这一点?

4

2 回答 2

4

要检查字符串的形式,您可以使用此^(?=[A-Z]*[1-9][A-Z]*$).{4}$正则表达式

  • ^.{4}$将确保长度 4
  • ^(?=[A-Z]*[1-9][A-Z]*$)将只接受包含 1-9 范围内的数字的字符串,这些数字可以用字母 AZ 包围

不确定这是否是您要检查字符串的方式,请告诉我

static boolean testStrings(String a, String b) {

    if (isValid(a) && isValid(b)) {
        for (int i = 0; i < 4; i++) {
            a = a.replaceFirst(String.valueOf(b.charAt(i)), "");
        }
        return a.length() <= (4 - 3);
    }else
        return false;

}

static boolean isValid(String s) {
    return s.matches("^(?=[A-Z]*[1-9][A-Z]*$).{4}$");
}
于 2013-02-15T16:31:04.243 回答
2

如果您想知道两个长度为 4 的字符串是否共有三个字符,并且您知道所有字符都在受限范围内,那么您只需将位集相交并计算位:

public static boolean haveNCharsInCommon(String a, String b, int n) {
  BitSet charsInA = charsIn(a);
  BitSet charsInB = charsIn(b);
  charsInA.and(charsInB);
  return charsInA.cardinality() >= n;
}

private BitSet charsIn(String s) {
  BitSet bs = new BitSet();
  for (int i = 0, n = s.length(); i < n; ++i) {
    bs.set(s.charAt(i);
  }
  return bs;
}

如果字符串可以包含任意代码点,您可能希望使用稀疏向量而不是位集。

于 2013-02-15T16:36:24.650 回答