TreeviewCopyright © qgao 2021-* all right reserved, powered by aleen42

字符串

1. 正则匹配

public boolean isMatch(String s, String p) {
    /*
        'match' below including .
    f(i,j) means s where s.len=i matches p where p.len=j
    f(i,j) =
        if (p_j-1 != * ) f(i-1, j-1) and s_i-1 matches p_j-1
        if (p_j-1 == * )
            * matches zero times: f(i,j-2)
            or * matches at least one time: f(i-1,j) and s_i-1 matches p_j-2
     */

    if (!p.isEmpty() && p.charAt(0) == '*') {
        return false;   // invalid p
    }

    boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];

    // initialize dp(0,0)
    dp[0][0] = true;

    // dp(k,0) and dp(0,2k-1) where k>=1 are false by default

    // initialize dp(0,2k) where p_2k-1 = * for any k>=1
    for (int j = 1; j < p.length(); j+=2) {
        if (p.charAt(j) == '*') {
            dp[0][j+1] = dp[0][j-1];
        }
    }

    for (int i = 1; i <= s.length(); i++) {
        for (int j = 1; j <= p.length(); j++) {
            if (p.charAt(j - 1) != '*') {
                dp[i][j] = dp[i - 1][j - 1] && isCharMatch(s.charAt(i - 1), p.charAt(j - 1));
            } else {
                dp[i][j] = dp[i][j - 2] || dp[i - 1][j] && isCharMatch(s.charAt(i - 1), p.charAt(j - 2));
            }
        }
    }

    return dp[s.length()][p.length()];
}

// no * in p
private boolean isCharMatch(char s, char p) {
    return p == '.' || s == p;
}

2. 最长不重复子串

/**
     * Given "abcabcbb", the answer is "abc", which the length is 3.

     Given "bbbbb", the answer is "b", with the length of 1
     * @param src
     * @return
     */
public int lengthOfLongestSubstring(String src) {
    if(src == null || src.length() <= 0){
        return -1;
    }

    int begin = 0,end = 0,strLength = src.length();
    Map<Character,Integer> charMap = new HashMap<Character, Integer>();
    int maxLength = 0;
    while (end < strLength){
        if(charMap.containsKey(src.charAt(end))){
            begin = Math.max(charMap.get(src.charAt(end)),begin);
        }
        maxLength = Math.max(maxLength,end - begin + 1);
        charMap.put(src.charAt(end),++end);
    }
    return maxLength;
}

3. kmp匹配算法

private int[] getNext(String pattern){
    if(pattern == null || pattern.length() <= 0){
        return null;
    }

    int strLength = pattern.length();
    int[] next = new int[strLength];
    int k = -1,j = 0;
    next[0] = -1;

    while (j < strLength -1){
        if(k == -1 || pattern.charAt(j) == pattern.charAt(k)){
            k++;
            j++;
            if(pattern.charAt(j) == pattern.charAt(k)){
                next[j] = next[k];
            }else {
                next[j] = k;
            }
        }
        else {
            k = next[k];
        }
    }
    return next;
}

public int kmpSearch(String source,String pattern){
    if(source == null || pattern == null){
        return -1;
    }
    if(pattern.length() > source.length()){
        return -1;
    }

    int srcPoint = 0,tarPoint = 0,srcLength = source.length(),ptnLength = pattern.length();
    int[] next = getNext(pattern);

    while (srcPoint < srcLength && tarPoint < ptnLength){
        if(tarPoint == -1 || source.charAt(srcPoint) == pattern.charAt(tarPoint)){
            srcPoint++;
            tarPoint++;
        }else {
            tarPoint = next[tarPoint];
        }
    }
    if(tarPoint == ptnLength){
        return srcPoint - ptnLength;
    }else {
        return -1;
    }
}

4. 最长回文子串

/**
     * Input: "babad"
     Output: "bab"

     Input: "cbbd"
     Output: "bb"
     * @param src
     * @return
     */
public String longestPalindrome(String src) {
    if(src == null || src.length() <= 0){
        return null;
    }

    char[] specialString = insertSymbol(src);
    int n = specialString.length;
    int[] p = new int[n];
    int center = 0,right = 0;

    for(int i = 1; i < n-1; i++){
        int iMirror = center - (i - center);
        p[i] = (right > i)?Math.min(right - i,p[iMirror]):0;

        while(specialString[i+1+p[i]] == specialString[i-1-p[i]]){
            p[i]++;
        }

        //更新center和right
        if(p[i] > right - i){
            center = i;
            right = i + p[i];
        }
    }

    int maxLength = 0,centerIndex = 0;
    for(int i = 1; i < n-1; i++){
        if(p[i] > maxLength){
            maxLength = p[i];
            centerIndex = i;
        }
    }

    System.out.println(centerIndex+"$"+maxLength);
    int temp = (centerIndex - 1 - maxLength) / 2;
    return src.substring(temp,temp+maxLength);
}
Copyright © qgao 2021-* all right reserved,powered by Gitbook该文件修订时间: 2022-07-08 12:24:46

results matching ""

    No results matching ""