字符串类型面试题目总结

字符串系列题目一览:

1.t1是否有与t2树拓扑结构相同的子树
2.判断两个字符串是否互为变形词?
3.判断两个字符串是否为旋转词?
4.字符串str,请在单词间做逆序调整。
5.给字符串str和一个整数i,i代表str中的位置,将str[0...i]移到右侧,str[i+1...N-1]移到左侧
6.将字符串数组strs拼接一个字符串,字典顺序最小
7.将str中空格字符替换成"%20",假设有足够空间
8.判断字符串是不是有效的括号字符串 str="(()" 返回false
9.判断字符串最长无重复子串的长度 str="abcd" 返回3

1.t1是否有与t2树拓扑结构相同的子树

2.判断两个字符串是否互为变形词?

两个字符串出现的字符种类和每个字符种类出现的次数一样,成为互为变形词。
可以声明256的数组,但是在Java中一个char字符类型占用两个字节,16位65535,所以可以声明65536大小的数组。
也可以使用哈希表解决这个问题。key为字符,value存储出现的次数。str1增加,str2减少。遍历结束正确的结果刚好为0,说明字符种类与出现次数相同。

    public static boolean distortion_test(String s1,String s2){
         if(s1==null||s2==null||s1.length()!=s2.length()){  
                return false;  
            }
        char[] c1=s1.toCharArray();
        char[] c2=s2.toCharArray();
        int[] k=new int[256];
        for(int i=0;i map=new HashMap();
        for(int i=0;i

3.判断两个字符串是否为旋转词?

把str前面任意部分挪到后面形成的字符串叫做str旋转词
a="abcd" b="cdab" 返回true

4.字符串str,请在单词间做逆序调整。

"pig loves dog"逆序成"dog loves pig"
构造一个字符串全体逆序方法。
先对将整体逆序 --->"god sevol gip",再循环到空格处,对单词进行逆序--->"dog loves pig",得到结果。

public static void inverse(char[] ch,int begin,int end){
        while(begin

5.给字符串str和一个整数i,i代表str中的位置,将str[0...i]移到右侧,str[i+1...N-1]移到左侧

str="abcde",i=2 调整后 str="deabc"
同上题,先构造逆序方法。对str逆序--->"edcba",然后再根据i的位置对两侧分别逆序,--->"deabc"

public static void inverse(char[] ch,int begin,int end){
        while(begin

6.将字符串数组strs拼接一个字符串,字典顺序最小

strs=["abc","de"] 拼成"abcde"
strs=["b","ba"]拼成"bab"
比较的内容为o1+o2>o2+o1,是两个字符串连接后的大小,而不是单独字符串的比较。

  public static String findSmallest(String[] strs, int n) {
            // write code here
            Arrays.sort(strs, new Comparator() {
     
                @Override
                public int compare(String o1, String o2) {
                    //此方法如果这个字符串是等参数字符串那么返回值0,==  
                    //如果这个字符串是按字典顺序小于字符串参数那么返回小于0的值,<  
                    //如果此字符串是按字典顺序大于字符串参数那么一个大于0的值 >  
                    String s1=o1+o2;
                    String s2=o2+o1;
                    return s1.compareTo(s2);
                }
            });
             
            StringBuilder sb=new StringBuilder();
            for(int i=0;i

7.将str中空格字符替换成"%20",假设有足够空间

s=s.replace(" ", "%20");

8.判断字符串是不是有效的括号字符串 str="(()" 返回false

    设置num,代表‘(’与‘)’出现此时差值,(就++,)就--,最后应该=0

9.判断字符串最长无重复子串的长度 str="abcd" 返回3

求出每个字符结尾的情况下,最长无重复字符子串的长度,并找出最大值返回
哈希表map --> 统计了每种字符之前出现的位置
整型数组preArr-->代表以s[i]结尾的情况下,最长无重复子串的长度

字符串类型面试题目总结_第1张图片
字符串类型面试题目总结_第2张图片

当循环中,遇见字符重复出现,求该字符的最大不重复子串时。需要比较:上一次该字符出现位置+1与 该字符左边字符的最长无重复子串。如上图位置A与位置B。选择A与B中靠右的点,该点到c的距离便是c的最长无重复子串。(A与B之间必然会重复,所以选择靠右的点)

public static int longestSubstring(String A, int n) {
        //charPosition统计A中每种字符之前出现的位置
        Map charPosition = new HashMap();
        //preArr代表以s[i-1]结尾的情况下,最长无重复子串的长度
        int[] preArr = new int[A.length()];
        char[] str2charArr = A.toCharArray();
        //从头到尾遍历str2charArr,统计出以每个字符为当前位置的向前最长无重复子串的长度
        for(int i=0; i= bPos){
                    //当前位置的最长无重复子串长度
                    preArr[i] = i - aPos + 1;
                }
                else{
                    //当前位置的最长无重复子串长度
                    preArr[i] = unRepeatLen + 1;
                }
                //更新当前字符出现的位置
                charPosition.put(str2charArr[i], i);
            }
        }
        //遍历preArr,最大值即为所求
        int max = preArr[0];
        for(int i: preArr) if(i > max) max = i;
        return max;
    }
    

你可能感兴趣的:(字符串类型面试题目总结)