コード例 #1
0
ファイル: WildcardMatching.java プロジェクト: Comdex/Leetcode
  public boolean isMatch(String s, String p) {
    // without this optimization, it will fail for large data set
    int plenNoStar = 0;
    for (char c : p.toCharArray()) if (c != '*') plenNoStar++;
    if (plenNoStar > s.length()) return false;

    s = " " + s;
    p = " " + p;
    int slen = s.length();
    int plen = p.length();

    boolean[] dp = new boolean[slen]; // 记录0的状态,一共len+1个
    TreeSet<Integer> firstTrueSet = new TreeSet<Integer>();
    firstTrueSet.add(0);
    dp[0] = true;

    boolean allStar = true;
    for (int pi = 1; pi < plen; pi++) {
      if (p.charAt(pi) != '*') allStar = false;
      for (int si = slen - 1; si >= 0; si--) {
        if (si == 0) {
          dp[si] = allStar ? true : false;
        } else if (p.charAt(pi) != '*') {
          if (s.charAt(si) == p.charAt(pi) || p.charAt(pi) == '?') dp[si] = dp[si - 1];
          else dp[si] = false;
        } else {
          int firstTruePos = firstTrueSet.isEmpty() ? Integer.MAX_VALUE : firstTrueSet.first();
          if (si >= firstTruePos) dp[si] = true;
          else dp[si] = false;
        }
        if (dp[si]) firstTrueSet.add(si);
        else firstTrueSet.remove(si);
      }
    }
    return dp[slen - 1];
  }
コード例 #2
0
ファイル: Solution.java プロジェクト: zhaoch93/Mytools
 private void merge(Interval p, Interval n) {
   if (p != null && n != null && (p.end == n.start || p.end + 1 == n.start)) {
     p.end = n.end;
     set.remove(n);
   }
 }