【问题标题】:String condition check字符串条件检查
【发布时间】:2014-12-08 22:34:44
【问题描述】:

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

  • 条件 1:如果所有字符都相同,则返回 true(如:'xxxxx')
  • 条件 2 : 如果除了一个字符之外所有都相同返回 true ( Like : 'xxxy')
  • 条件3:如果所有字符都相同而其他字符更多 不止一次 retun false 。 (like : 'xxxyy' // y 存在 2 次)

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

【问题讨论】:

  • yyyyx 是真的,yyyxyyx 是假的吗?什么是'xyxyx`?
  • 条件 3 对我来说没有意义,可以详细说明一下,谢谢
  • 是 @JonathanM 在 yyyyx 中多数是 y 并且允许一个 x 但在 yyyxyyx 中多数是 y 但 x 出现不止一次
  • 在第三种情况下,除了允许一个额外的字符之外,哪个字符在字符串中占多数,不超过一次。@Saruman
  • 如果您想计算字符串中的x,请尝试s.replaceAll("y","").length(),如果我了解问题所在。您应该能够根据这个和原始字符串的长度找出答案。

标签: java regex performance algorithm


【解决方案1】:

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

简而言之:

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

所以在x*(yx*)

  • x* 表示零个或多个x 字符,也就是说它可以表示空字符串""xxxxxx,等等
  • yx* 可以表示 y 后面有零个或多个 xes 的字符串,如 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;
}

【讨论】:

  • 但它可能像 xxyxx 之间有'Y'?然后它也应该返回 true
  • @Sumeet 确实如此。测试一下。
【解决方案2】:

嗯。我认为这对你有用:

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;

【讨论】:

    【解决方案3】:

    我认为这里没有必要使用正则表达式;与简单地遍历字符串并检查字符相比,正则表达式编译可能需要更多的运行时间。 (这篇文章的标签是“性能,毕竟)

    用漂亮的方式写下来比我最初预期的要困难一些,但并不可怕,而且应该相当快:

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

    【讨论】:

    • 不适用于"yxxxx",我认为它满足条件2。也许再进行一次测试,您就可以发现这种情况。
    • 啊,真的。会修复。编辑:嗯。它变得有点难看,尽管可能仍然比正则表达式快。让我想一想。
    • 它是否适用于 xxyxx ,在​​这种情况下它也应该返回 true 因为 y 只发生一次
    • 是的,它会的。但是必须有一个更漂亮的方法来写下这个算法。
    • 嗯,这看起来已经很漂亮了。不过应该很快。
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多