2018-12-03

2018-12-05  本文已影响0人  Raymond123

今天刷题在找各种资料的时候,发现了以前一些同学当年刷题准备的时候都写过blog,觉得这个确实是个不错的tool去record并且整理一些事情。现在我也确实处在一个关键的时间点上,就每天来写一点东西记录一下今天的准备和心得吧。Go fight!

LeetCode Wildcard Matching

这题肯定是可以用DP解决的,但是参考了一下各种解法,其实Backtracking 还有贪心都是潜在的解决方案。

先从Greedy + Iteration 开始吧
首先 '?' match and only match one character 或者两个String的character都相等,这时两个都会移动一格
其次处理 ' * ', 由于它可以match any length string or empty string 所以这里要涉及到backtracking, 但由于这个是独立情况,所以可以单独处理,这里使用了 two pointers 来回溯,star是p的 ' * ' index,match是s match的index。

class Solution {
    public boolean isMatch(String s, String p) {
        int ss = 0;
        int pp = 0;
        int star = -1;
        int match = -1;
        
        while (ss < s.length()) {
            if (pp < p.length() && p.charAt(pp) == '?') {
                ss++;
                pp++;
            }else if (pp < p.length() && p.charAt(pp) == s.charAt(ss)) {
                ss++;
                pp++;                
            }else if (pp < p.length() && p.charAt(pp) == '*') {
                star = pp;
                match = ss;
                pp++;
            }else if (star != -1) {
                pp = star + 1;
                match++;
                ss = match;
            }else {
                return false;
            }
        }
        
        while (pp < p.length()) {
            if (p.charAt(pp) == '*') {
                pp++;
            }else {
                return false;
            }
        }
        return true;
    }
}

DP 解法 (未完待续)

上一篇下一篇

猜你喜欢

热点阅读