字符串相关考题思路

题目一:拓扑结构相同子树

入图片描述](https://img-blog.csdnimg.cn/20200618080423550.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIwNjkyOA==,size_16,color_FFFFFF,t_70)

在这里插入图片描述

在这里插入图片描述

代码演示

import java.util.*;
public class IdenticalTree {  
       public class TreeNode {
	    int val = 0;
	    TreeNode left = null;
	    TreeNode right = null;
	    public TreeNode(int val) {
	        this.val = val;
	    }
	}
        public boolean chkIdentical(TreeNode A, TreeNode B) {
            // write code here
            String t1str = serialByPre(A);
            String t2str = serialByPre(B);
            return t1str.indexOf(t2str) == -1 ? false : true
	}
	public String serialByPre(TreeNode T){
	       if(T == null){
	           return "#_";
	       }
	       String res = T.val + "_";
	       res += serialByPre(T.left);
	       res += serialByPre(T.right);
	       return res;   
        } 
}

在这里插入图片描述

题目二:词语变形

在这里插入图片描述

在这里插入图片描述

代码演示

import java.util.*;
public class Transform {
    public boolean chkTransform(String A, int lena, String B, int lenb) {
        // write code here
        if(lena != lenb){
            return false;
        }
        HashMap<Character,Integer> map = new HashMap<>();
        for(int i=0;i<lena;i++){
            if(map.containsKey(A.charAt(i))){
                int num = map.get(A.charAt(i));
                num++;
            }else{
                map.put(A.charAt(i),1);
            }
        }
        for(int i=0;i<lenb;i++){
            if(map.containsKey(B.charAt(i))){
                int numa = map.get(A.charAt(i));
                int numb = map.get(B.charAt(i));
                if(numa != numb){
                    return false;
                }
            }else{
                return false;
            }
        }
        return true;
    }
}

题目三:两串旋转

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import java.util.*;
public class Rotation {
    public boolean chkRotation(String A, int lena, String B, int lenb) {
        // write code here
        if(lena != lenb){
            return false;
        }
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<lena;i++){
            sb.append(A.charAt(i));
        }
        for(int i=0;i<lena;i++){
            sb.append(A.charAt(i));
        }
        String A_ = sb.toString();
        return A_.indexOf(B) == -1 ? false : true;
    }
}

或者:

import java.util.*;
public class Rotation {
    public boolean chkRotation(String A, int lena, String B, int lenb) {
        // write code here
        if(lena != lenb || A == null || B == null){
            return false;
        }
        String A_two = A + A;
        return A_two.indexOf(B) == -1 ? false : true;
    }
}

题目四:句子逆序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

实现代码

import java.util.*;
public class Reverse {
    public String reverseSentence(String A, int n) {
        // write code here
        char[] cs = A.toCharArray();
        char[] c = reverse(cs,0,cs.length-1);
        int l = -1;
        int r = -1;
        for(int i=0;i<c.length;i++){
            if(c[i] != ' '){
                if(i==0 || c[i-1] == ' '){
                    l = i;
                }
                if(i == c.length-1 || c[i+1] == ' '){
                    r = i;
                }
                reverse(c,l,r);
            }else{
                l = -1;
                r = -1;
            }
        }
        return String.valueOf(c);
    }
    
    public char[] reverse(char[] cs,int left,int right){
        char temp = ' ';
        while(left<right){
            temp = cs[left];
            cs[left] = cs[right];
            cs[right] = temp;
            left++;
            right--;
        }
        return cs;
    }
}

或者:

import java.util.*;
public class Reverse {
    public String reverseSentence(String A, int n) {
        // write code here
        Stack<String> stack = new Stack<String>();
        String[] words = A.split(" ");
        for(int i=0;i<words.length;i++){
            stack.push(words[i]);
        }
        StringBuffer sb = new StringBuffer();
        while(!stack.isEmpty()){
            sb.append(stack.pop()+" ");
        }
        return sb.toString().trim();
    }
}

或者:

import java.util.*;
public class Reverse {
    public String reverseSentence(String A, int n) {
        // write code here
        String[] ss = A.split(" ");
        StringBuffer sb = new StringBuffer();
        for(int i = ss.length-1;i>=0;i--){
            sb.append(ss[i]+" ");
        }
        return sb.toString().trim();
    }
}

题目五:字符串移位

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

方法一:

import java.util.*;
public class Translation {
    public String stringTranslation(String A, int n, int len) {
        // write code here
        char[] ch = A.toCharArray();
        rotate(ch,0,len-1);
        rotate(ch,len,n-1);
        rotate(ch,0,n-1);
        return String.valueOf(ch);
    }
    
    public void rotate(char[] ch,int left,int right){
        char temp = ' ';
        while(left<right){
            temp = ch[left];
            ch[left] = ch[right];
            ch[right] = temp;
            left++;
            right--;
        }
    }
}

方法二:

import java.util.*;
public class Translation {
    public String stringTranslation(String A, int n, int len) {
        // write code here
        String ss = A + A;
        String sub = ss.substring(len,n+len); //substring包左不包右
        return sub;
    }
}

在这里插入图片描述

题目六:拼接最小字典序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

import java.util.*;
public class Prior {
    public static class StrAscending implements Comparator<String>{
        public int compare(String s1,String s2){
            return (s1+s2).compareTo(s2+s1);
        }
    }
    
    public String findSmallest(String[] strs, int n) {
        // write code here
        String str="";
        Arrays.sort(strs,new StrAscending());
        for(int i=0;i<strs.length;i++){
            str += strs[i];
        }
        return str;       
    }
}

题目七:空格替换

在这里插入图片描述

import java.util.*;
public class Replacement {
    public String replaceSpace(String iniString, int length) {
        // write code here
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<iniString.length();i++){
            if(iniString.charAt(i) == ' '){
                sb.append("%20");
            }else{
                sb.append(iniString.charAt(i));
            }
        }
        return sb.toString();
    }
}

或者:

import java.util.*;
public class Replacement {
    public String replaceSpace(String iniString, int length) {
        // write code here
        String s = iniString.replaceAll(" ","%20");
        return s;
    }
}

题目八:合法括号序列判断

在这里插入图片描述
思路:在这里插入图片描述
代码实现:

import java.util.*;
public class Parenthesis {
    public boolean chkParenthesis(String A, int n) {
        // write code here
        if(n%2!=0){
            return false;
        }
        Stack stack = new Stack();
        for(int i=0;i<A.length();i++){
            if(A.charAt(i) == '('){
                stack.push(A.charAt(i));
            }else if(A.charAt(i) == ')'){
                if(stack.isEmpty()){
                    return false;
                }
                stack.pop();
            }else{
                return false;
            }
        }
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }
}

或者:

import java.util.*;
public class Parenthesis {
    public boolean chkParenthesis(String A, int n) {
        // write code here
        char[] arr = A.toCharArray();
        int count = 0;
        for(int i=0;i<n;i++){
            if(arr[i] != '(' && arr[i] != ')'){
                return false;
            }
            if(arr[i] == '('){
                count++;
            }
            if(arr[i] == ')'){
                count--;
                if(count<0){
                    return false;
                }
            }
        }
        if(count != 0){
            return false;
        }
        return true;
    }
}

题目九:最长无重复字符子串

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述代码实现

import java.util.*;
public class DistinctSubstring {
    public int longestSubstring(String A, int n) {
        // write code here
        if(A == null || n== 0){
            return 0;
        }
        char[] chs = A.toCharArray();
        int[] map = new int[256];
        for(int i=0;i<256;i++){
            map[i] = -1;
        }
        int len = 0;
        int pre = -1;
        int cur = 0;
        for(int i=0;i<n;i++){
            pre = Math.max(pre,map[chs[i]]);
            cur = i - pre;
            len = Math.max(len,cur);
            map[chs[i]] = i;
        }
        return len;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值