恋上数据结构与算法第三季课堂笔记05

1.面试题01.09.:字符串轮转

恋上数据结构与算法第三季课堂笔记05

思想:通过s1+s1获得一个字符串,判断s2是否是s1的子串即可。

代码:

  public boolean isFlipedString(String s1, String s2) {
        if(s1 == null || s2 == null) return false;
        if(s1.length() != s2.length()) return false;
        return (s1+s1).contains(s2);

    }

2._572另一个树的子树

恋上数据结构与算法第三季课堂笔记05

思路:本题采用树的序列化思想来解决

           首先对树按照前序、中序或后续的方式进行序列化。(前序有坑,需注意避开)序列化成字符串后,比较字符串是否包含即可。

代码:

    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null || subRoot == null) return false;
        return postSerialized(root).contains(postSerialized(subRoot));
    }
    private String postSerialized(TreeNode node){
        StringBuilder sb = new StringBuilder();
        postSerialized(node,sb);
        //StringBuilder类型转换成String类型
        return sb.toString();
    }
    private void postSerialized(TreeNode node,StringBuilder s){
        if(node.left == null){
            s.append("#!");
        }else{
            postSerialized(node.left,s);
        }
        if(node.right == null){
            s.append("#!");
        }else{
            postSerialized(node.right,s);
        }
        s.append(node.val).append("!");
    }

3._242_有效的字母异位词

恋上数据结构与算法第三季课堂笔记05

思路:1.可以用哈希表来解决此问题,但是哈希表应用到此问题上有点重。本题可以参照哈希表的思想。

           2.存储一个能存放26位字母的哈希表,哈希表的value代表字母出现的次数。

           3.同时遍历s和t两个字符串,s字符串出现的字符,在对应位置++,t字符串出现的字符,                    则--;

代码:

    public boolean isAnagram(String s, String t) {
        if(s == null || t == null) return false;
        char[] s1 = s.toCharArray();
        char[] t1 = t.toCharArray();
        if(s1.length != t1.length) return false;
        int[] counts = new int[26];
        for(int i = 0;i < s1.length;i++){
            counts[s1[i] - 'a']++;
        }
        for(int i = 0;i<s1.length;i++){
            if(--counts[t1[i] - 'a'] < 0) return false;
        }
        return true;


    }

上一篇:2022CSP初赛普及组比赛详情


下一篇:字符串A->字符串B例题 :最短编辑距离、最优包含 (线性DP)