• 字符串常见考题


    1.需要掌握的相关概念

      1.回文

      2.字串(连续)

      3.子序列(不连续)

      4.前缀树(Trie树)

      5.后缀树和后缀数组

      6.匹配

      7.字典序

    1.判断一个二叉树是否另一个二叉树的子树

      方法:将二叉树序列化,再使用KMP算法进行匹配即可,时间复杂度O(M+N).

      要点:1.将二叉树进行序列化的时需标记出空节点。

    2.判断两个词是否互为变形词

      变形词:所有字符串出现的次数相同,包括次数为0的

      方法:使用Hash表计数后进行比较,其中如果是c/c++语言,可用256长度的数组,java则可用65536长度的数组作为哈希表提高效率。

      

    3.旋转词

      1.str1="1234",str2="2341"

      2.判断str2是否为str1的旋转词:

        1.str=str1+str1 ,即"12341234"

        2.利用kmp算法(O(m+n))判断是否str包含str2

      3.str中的任意长度为N的子串都是str1的旋转词。

    4.字符串倒序

      str1="god i like you." 变为str2="you like i god"

      步骤:

        1.反转字符串为".uoy ekil i dog"

        2.逐词反转,"you. like i god"

        3.反转方法:

         按照字符串长度的奇偶性反转。

          

     5.移动子串

      问题描述:给定字符串str,整数i,将0...i移动到N-1-i,N-1,将i+1..N-1移动到0...N-i

      如"HELLOWORLD",i=4   DLROWOLLEH 

      步骤:1.分别局部反转0...i,i+1...N-1   -->"OLLEHDLROW"

         2.将整体反转         -->"WORLDHELLO"

         (也可以先整体,再局部)

      时间复杂度O(N) ,空间复杂度O(1)

    6.拼接出字典顺序最小的大字符串

      问题描述:给定一个字符串数组,找出一种拼接顺序,使得到的大字符串是所有可能结果中字典顺序最小的

      分析:1.这是一个排序问题,需要对该字符串数组进行排序,然后按顺序拼接即可。

         2.不能直接对字符串数组中的字符串按字典顺序排序,如[“b","ba"],拼接出的bba比bab实际上大。

      方法:重写排序规则,如果str1+str2<str2+str1,则str1<str2.

    7.替换空字符为某字符串

      问题描述:如将"good for you"替换为"good%20for%20you"。

      方法:1.遍历寻找空字符个数,计算出新字符串的长度

         2.从后往前置入新字符:如果是空字符,则依次放入'0','2','%',否则置入str[i].直到i=0

    8.判断字符串中的括号是否闭合

      方法类似于使用栈的方法,只是用一个整数num替换。

      方法:遍历字符串,遇到左则num++,右则num--,一旦num<0,返回false

         如果遍历结束,num=0,返回true,否则false.

    9.求最长无重复子串的长度

     分析:

    补充:有两种情况,第一种由于上次出现c的位置在pre右边,则c到c'必不重复,由于前一个字符最左不重复位置为pre+1

             第二种由于pre出现在c右边,则pre到c必不重复。

        这种方法属于动态规划的一种,做到了时间复杂度O(N),空间复杂度取决于Map。

     public int longestSubstring(String A, int n) {
            // write code here
            if(A==null||n==0) return 0;
            char[] arr=A.toCharArray();
            int[] map=new int[256];
            for(int i=0;i<256;i++) map[i]=-1;
            
            int pre=-1;
            int len=0;
            for(int i=0;i<arr.length;i++){
           //pre维护着无重复字串的最左的左一个位置(到i-1位置的无重复字串) pre
    =Math.max(pre,map[arr[i]]); len=Math.max(len,i-pre); map[arr[i]]=i; } return len; }

     

  • 相关阅读:
    java 实现串口通信
    下载 Microsoft .NET Framework 4和4.5.2(独立安装程序)
    vm15.5.1安装Mac os X
    开源网盘系统
    Photoshop另存为图片为.ico格式(图标文件)的插件
    VeraCrypt(文件加密工具)创建和加载“文件型加密卷”的步骤
    强制浏览器字体为宋体或其他指定的字体
    超微主板风扇模式
    通过URL获取该页面内的所有超链接
    photoshop新建时提示“无法完成请求,因为暂存盘已满”的解决方案
  • 原文地址:https://www.cnblogs.com/lshao/p/8984891.html
Copyright © 2020-2023  润新知