字符串条件检查

时间:2014-12-08 22:34:44

标签: java regex performance algorithm

我的字符串总是包含x或y,我必须根据以下条件进行验证

  • 条件1:如果所有字符都相同则返回true(如:'xxxxx')
  • 条件2:如果一个字符都相同,则返回true(如 :'xxxxy')
  • 条件3:如果所有角色都相同而其他角色更多 不止一次回归虚假。 (例如:'xxxyy'// y存在2次)

如何在不编写具有条件的复杂for循环的情况下检查这一点。有没有使用xor的解决方案,或者如果我将字符串存储为boolen或number(x = 1或者y = 0或false),它会有用吗。

3 个答案:

答案 0 :(得分:2)

x*(yx*)?|y*(xy*)?似乎正在做你想做的事。如果您不想接受空字符串,可以先将*更改为+

简而言之:

  • *是量词,意味着它之前的元素可以出现零次或多次
  • ?表示之前的元素是可选的
  • |是OR运算符

所以在x*(yx*)

  • x*表示零个或多个x个字符,这意味着它可以表示空字符串""xxxxxx等等
  • yx*可以表示y之后的x字符串,其后面有yyxyxx

这个正则表达式试图检查字符串是否为

  • xxxx,可选yxxx部分,
  • yyyy,可选xyyy部分。

演示

String regex = "x*(yx*)?|y*(xy*)?";

System.out.println("xxx".matches(regex));
System.out.println("xxxy".matches(regex));
System.out.println("xxyx".matches(regex));
System.out.println("xxxyy".matches(regex));

输出:

true
true
true
false

  

如何在不使用条件

编写复杂for循环的情况下检查此内容

这取决于复杂的含义。像这样的循环非常简单IMO

public static boolean check(String text){
    long xCounter = 0;
    long yCounter = 0;
    for (char ch : text.toCharArray()){
        if (ch=='x') xCounter++;
        else if (ch=='y') yCounter++;
        else return false;//non x or y appeared
    }
    return xCounter < 2 || yCounter < 2;
}

答案 1 :(得分:0)

我认为没有必要在这里使用正则表达式;正则表达式编译可能比简单地遍历字符串并检查字符需要更多的运行时间。 (该帖子被标记为“表演,毕竟”)

这比我最初预期的方式写起来有点困难,但它并不可怕,它应该相当快:

public static boolean foo(String str) {
  // if the string only has three characters, both can't be in it twice.
  if(str.length() < 4) {
    return true;
  }

  // To start with, assume that the first character is the main
  // character (the one that appears more often). Search for the
  // other one.
  char needle = str.charAt(0) == 'x' ? 'y' : 'x';
  int first = str.indexOf(needle, 1);

  if(first == -1) {
    // Didn't find the other character at all.
    return true;
  }

  if(first ==  1) {
    // The first two characters are different from each other.
    // What we first thought was the main character might be
    // the lesser after all.
    needle = str.charAt(2) == 'x' ? 'y' : 'x';

    // skip unnecessary check.
    first = 2;
  }

  return str.indexOf(needle, first + 1) == -1;
}

答案 2 :(得分:0)

嗯。我认为这对你有用:

if (str.length() < 4)
    return true;
String reduction = str.replaceAll("y","");
if (reduction.length() < 2 || (str.length() - reduction.length()) < 2)
    return true;
else
    return false;