美文网首页
多方法 04

多方法 04

作者: 眼若繁星丶 | 来源:发表于2020-08-19 12:23 被阅读0次

    多方法 04


    LeetCode 647

    https://leetcode-cn.com/problems/palindromic-substrings/

    中心靠拢

    遍历字符串,以当前指针或者相邻两指针为中心,向两侧同时扩展,如果符合回文字符串,则累加数据,同时继续向外扩展,直到越界或者不符合回文字符串

    class Solution {
        public int countSubstrings(String s) {
            int n = s.length();
            int cnt = 0;
            if (n == 0 || s == null) {
                return 0;
            }
            
            for (int i = 0; i < n; i++) {
                cnt += count(s, i, i);
                cnt += count(s, i, i + 1);
            }
            return cnt;
        }
    
        public int count(String s, int i, int j) {
            int cnt = 0;
            while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
                cnt++;
                i--;
                j++;
            }
            return cnt;
        }
    }
    

    动态规划

    dp是一个Boolean的二维数组,其值表示能否成为一个回文子串。
    i 和 j 分别是第一维第二维的,表示子串的开头和结尾。

    对角线都是回文子串,是true。

    如果回文子串长度只有2,则判断两个字符是否一样,一样则true

    如果回文子串长度大于2,则判断两个字符是否一样,同时根据dp[i+1][j-1]来更新dp[i][j]的值。表示左右指针向里面靠拢后形成的子串是否为回文子串。

    class Solution {
        public int countSubstrings(String s) {
            int n = s.length();
            int cnt = 0;
            if (n == 0 || s == null) {
                return 0;
            }
            Boolean[][] dp = new Boolean[n + 1][n + 1];
            for (int i = 0; i < n; i++) {
                Arrays.fill(dp[i], false);
            }
            for (int j = 0; j < n; j++) {
                for (int i = 0; i <= j; i++) {
                    if (i == j) {
                        dp[i][j] = true;
                        cnt++;
                    } else if (j == i + 1 && s.charAt(i) == s.charAt(j)) {
                        dp[i][j] = true;
                        cnt++;
                    } else if (j > i + 1 && s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
                        dp[i][j] = true;
                        cnt++;
                    }
                }
            }
            return cnt;
        }
    
        public static void main(String[] args) {
            Solution k = new Solution();
            String a = new String("abc");
            System.out.println(k.countSubstrings(a));
        }
    }

    相关文章

      网友评论

          本文标题:多方法 04

          本文链接:https://www.haomeiwen.com/subject/ixmrjktx.html