检测列表/数组中的模式

时间:2015-11-08 09:53:03

标签: java algorithm pattern-matching

这是一个算法问题。

我有一个Java列表(已排序)或由字符(X和Y)组成的数组,我需要检测值的排序方式。

列表大小是固定的(例如5)。我想要检测的模式如下:

XYYYY
XXYYY
XXXYY
XXXXY
XXXXX

所以X总是只跟着Y&#39>。

简单的String.equals或contains不起作用,因为它不可扩展,并且仅限于已知的列表大小。

2 个答案:

答案 0 :(得分:0)

您可以使用简单的正则表达式:

boolean matches = s.matches("^X+Y*$");

这意味着:

  • ^匹配字符串的开头
  • X+表示一个或多个连续X s
  • Y*表示零个或多个连续Y s
  • $是字符串的结尾

或者,您可以按字符顺序检查字符串:

int i = 0;
while (i < s.length() && s.charAt(i) == 'X') {
  ++i;
}
if (i < s.length()) {
  if (s.charAt(i) != 'Y') {
    return false;
  }
  while (i < s.length() && s.charAt(i) == 'Y') {
    ++i;
  }
}
return i == s.length();

答案 1 :(得分:0)

您可以使用以下正则表达式来检测特定模式。

String pattern = "^(X){1,}Y*$";

这是完整的Java代码,

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternMatch {
    public static void main(String[] args){
        // String to be scanned to find the pattern.
        String line = "XXXXY";
        String pattern = "^(X){1,}Y*$";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Now create matcher object.
        Matcher m = r.matcher(line);
        if (m.find( )) {
             System.out.println("Found value: " + m.group(0) );
        } else {
             System.out.println("NO MATCH");
        }
    }
}