美文网首页
字符串类型面试题目总结

字符串类型面试题目总结

作者: icecrea | 来源:发表于2017-08-21 20:44 被阅读55次

字符串系列题目一览:

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<c1.length;i++){
            k[c1[i]]++;
        }
        for(int i=0;i<c2.length;i++){
            if(k[c2[i]]==0)
                return false;
            k[c2[i]]--;
        }
        return true;
    }
    
    public static boolean distortion_test2(String s1,String s2){
         if(s1==null||s2==null||s1.length()!=s2.length()){  
                return false;  
            }  
        char[] c1=s1.toCharArray();
        char[] c2=s2.toCharArray();
        Map<Character, Integer> map=new HashMap<Character,Integer>();
        for(int i=0;i<c1.length;i++){
            if(map.get(c1[i])==null)
                map.put(c1[i], 1);
            else        
                map.put(c1[i],map.get(c1[i])+1);
        }
        for(int i=0;i<c2.length;i++){
            if(map.get(c2[i])==null||map.get(c2[i])==0)
                return false;
            else
                map.put(c2[i], map.get(c2[i])-1);
        }
        return true;
    }

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<end){
            char temp=ch[begin];
            ch[begin]=ch[end];
            ch[end]=temp;
            begin++;
            end--;
        }
    }
    
    public static String swapWord(String s){
        char[] a=s.toCharArray();
        inverse(a,0,a.length-1);
        int blank=-1;
        for(int i=0;i<a.length;i++){
            if(a[i]==' '){
                int nextBlank=i;
                inverse(a,blank+1,nextBlank-1);
                blank=nextBlank;
            }
        }
        inverse(a,blank+1,a.length-1);
        return (new String(a));
    }

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<end){
            char temp=ch[begin];
            ch[begin]=ch[end];
            ch[end]=temp;
            begin++;
            end--;
        }
    }
    
    public static String shift(String s,int i){
        char[] ch=s.toCharArray();
        inverse(ch,0,ch.length-1);
        inverse(ch,0,ch.length-i-2);
        inverse(ch,ch.length-i-1,ch.length-1);
        return new String(ch);
    }
    
    public static void main(String args[]){
        String s="abcde";
        System.out.println(shift(s,3));
    }

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<String>() {
     
                @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<n;i++){
                sb.append(strs[i]);              
            }
            return sb.toString();     
      }
    
      public static void main(String args[]){
          String s[]=new String[]{"ba","b"};
          System.out.println(findSmallest(s, s.length));
      }

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

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

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

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

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

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


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

public static int longestSubstring(String A, int n) {
        //charPosition统计A中每种字符之前出现的位置
        Map<Character, Integer> charPosition = new HashMap<Character, Integer>();
        //preArr代表以s[i-1]结尾的情况下,最长无重复子串的长度
        int[] preArr = new int[A.length()];
        char[] str2charArr = A.toCharArray();
        //从头到尾遍历str2charArr,统计出以每个字符为当前位置的向前最长无重复子串的长度
        for(int i=0; i<A.length(); i++){
            Integer lastPosOfChar = charPosition.get(str2charArr[i]);
            if(lastPosOfChar == null){//说明当前字符第一次出现
                //更新最长无重复子串的长度
                preArr[i] = i == 0 ? 1 : preArr[i-1] + 1;
                //记录当前字符出现的位置
                charPosition.put(str2charArr[i], i);
            }
            else{//当前字符不是第一次出现(既然不是第一次出现,那也不是在第一个位置),也就是之前出现过该字符
                //获取前一个字符最长无重复子串的长度
                int aPos = lastPosOfChar + 1; //上一次出现该字符的位置+1
                int unRepeatLen = preArr[i-1];//以该字符左侧一位字符为标准的最长无重复子串的长度
                int bPos = i - unRepeatLen;
                if(aPos >= 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;
    }
    

相关文章

网友评论

      本文标题:字符串类型面试题目总结

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