字符串常见面试题

本文主要探讨面试中常见的字符串相关问题,包括字符串的特点、类型、解题思路和实现方法。涉及回文判断、子串查找、字符串旋转、变形词判断、两串旋转、句子逆序、字符串移位、拼接最小字典、空格替换、合法括号序列判断及最长无重复字串等题目,讲解了多种算法和数据结构的应用,如哈希表、动态规划、搜索、Manacher 算法、KMP 算法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试相关

特点

  1. 广泛性
    1. 可看作是字符类型的数组,与数组的排序、查找、调整有关
    2. 很多其他类型的面试题可看作是字符串类型的面试题
  2. 需要掌握的概念
    1. 回文
    2. 子串(连续)
    3. 子序列(不连续)
    4. 前缀树(Trie 树)
    5. 后缀树和后缀数组
    6. 匹配
    7. 字典序
  3. 需要掌握的操作
    1. 与数组有关的操作:增删改查
    2. 字符替换
    3. 字符串旋转

注意:用 Java 实现字符串类型题目时,需要掌握 StringBuilder、 StringBuffer 类 与 toCharArray() 方法。

类型

  1. 规则判断

    整数、浮点数、回文等

  2. 数字运算

    int 和 long 所能表达的整数范围有限,所以常会使用字符串实现大整数

    与大整数相关的加减乘除操作,需要模拟笔算的过程

  3. 与数组操作有关

    数组有关的调整、排序等操作需要掌握;快速排序的划分过程需要掌握和改写。

  4. 字符计数

    哈希表;定长数组;滑动窗口问题、寻找无重复字符子串问题、计算变位词问题等。

  5. 动态规划类型

    最长公共字串、最长公共子序列、最长回文子串、最长回文子序列

  6. 搜索类型

    宽度优先搜索、深度优先搜索

  7. 高级算法与数据结构解决的问题

    1. Manacher 算法解决最长回文子串
    2. KMP 算法解决字符串匹配
    3. 前缀树结构
    4. 后缀树和后缀数组

    这类结构较为复杂,通常面试中很少出现。

二叉树相同子树

在这里插入图片描述

一般解法

遍历匹配:

    public boolean HasSubtree(TreeNode root1, TreeNode root2) {
   
        boolean result = false;
        //当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false
        if (root2 != null && root1 != null) {
   
            //如果找到了对应Tree2的根节点的点
            if (root1.val == root2.val) {
   
                //以这个根节点为为起点判断是否包含Tree2
                result = doesTree1HaveTree2(root1, root2);
            }
            //如果找不到,那么就再去root的左儿子当作起点,去判断时候包含Tree2
            if (!result) {
   
                result = HasSubtree(root1.left, root2);
            }

            //如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含Tree2
            if (!result) {
   
                result = HasSubtree(root1.right, root2);
            }
        }
        //返回结果
        return result;
    }

    public boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2) {
   
        //如果Tree2已经遍历完了都能对应的上,返回true
        if (node2 == null) {
   
            return true;
        }
        //如果Tree2还没有遍历完,Tree1却遍历完了。返回false
        if (node1 == null) {
   
            return false;
        }
        //如果其中有一个点没有对应上,返回false
        if (node1.val != node2.val) {
   
            return false;
        }

        //如果根节点对应的上,那么就分别去子节点里面匹配
        return doesTree1HaveTree2(node1.left, node2.left) && doesTree1HaveTree2(node1.right, node2.right);
    }

字符串解法

在这里插入图片描述

    // 如果不记录空指针,仅靠前序遍历无法确定二叉树
    public boolean chkIdentical(TreeNode A, TreeNode B) {
   
        if (A == null || B == null) return false;
        StringBuilder aString = new StringBuilder();
        StringBuilder bString = new StringBuilder();

        ArrayList<TreeNode> listA = new ArrayList<>();
        ArrayList<TreeNode> listB = new ArrayList<>();

        // 实际上是模拟栈
        listA.add(A);
        while (!listA.isEmpty()) {
   
            A = listA.remove(listA.size() - 1);
            aString.append(A.val + "!");
            if (A.right != null) {
    		// 后出先入
                listA.add(A.right);
            } else aString.append("#!");

            if (A.left != null) {
   
                listA.add(A.left);
            } else aString.append("#!");

        }

        listB.add(B);
        while (!listB.isEmpty()) {
   
            B = listB.remove(listB.size() - 1);
            bString.append(B.val + "!");
            if (B.right != null) {
   
                listB.add(B.right);
            } else bString.append("#!");

            if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值