算法:字符串题目总结

题目1:344.反转字符串
思路:双指针法

class Solution {
    public void reverseString(char[] s) {
        int right=s.length-1;
        for(int i=0;i<s.length;i++){
            if(i<right){
                char temp=s[i];
                s[i]=s[right];
                s[right]=temp;
                right--;
            }
        }
    }
}

题目2:541. 反转字符串II

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        //每隔 2k 个字符的前 k 个字符进行反转
        for(int i=0;i<ch.length;i+=2*k){
            //大于等于k个前k个反转
            if (i + k <= ch.length) {
                reverse(ch, i, i + k -1);
                continue;
            }
            //少于k个全部反转
            reverse(ch, i, ch.length - 1);
        }
        return  new String(ch);
    }

    public void reverse(char[] ch, int i, int j) {
        for (; i < j; i++) {
            char temp  = ch[i];
            ch[i] = ch[j];
            ch[j] = temp;
            j--;
        }
    }
}

题目3:剑指 Offer 05. 替换空格
思路:使用了StringBuilder

class Solution {
    public String replaceSpace(String s) {
        StringBuilder sb = new StringBuilder();
        for(char c:s.toCharArray()){
            if(String.valueOf(c).equals(" ")){
                sb.append("%20");
            }else{
                sb.append(String.valueOf(c));
            }
        }
        return sb.toString();
    }
}

题目4:151.翻转字符串里的单词
思路:首先要使用快慢指针思路移除多余空格,移除完空格后用左右指针反转字符串,左右指针反串各个单词(需再看看)

class Solution {
    public String reverseWords(String s) {
        //移除空格 与移除元素类似
        StringBuilder sb = removeSpace(s);
        //反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
         //反转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }

    private StringBuilder removeSpace(String s) {
        int slow = 0;
        char[] nums=s.toCharArray();
        StringBuilder sb = new StringBuilder();
        for(int fast=0;fast<nums.length;fast++){
            if (nums[fast] != ' ') {
                if(slow!=0){
                    nums[slow]=' ';
                    sb.append(nums[slow]);
                    slow++;
                }
                while(fast<nums.length&&nums[fast]!=' '){
                    nums[slow]=nums[fast];
                    sb.append(nums[slow]);
                    slow++;
                    fast++;
                }
            }
        }
        return sb;
    }

    public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
    
    private void reverseEachWord(StringBuilder sb) {
        int start = 0;
        int end = 1;
        int n = sb.length();
        while (start < n) {
            while (end < n && sb.charAt(end) != ' ') {
                end++;
            }
            reverseString(sb, start, end - 1);
            start = end + 1;
            end = start + 1;
        }
    }
}

题目5:剑指 Offer 58 - II. 左旋转字符串
思路:和上道题有点相似,都是靠怎么反转,这道题是先整体反转再反转n的前部分再反转n的后部分。

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] chars=s.toCharArray();
        //先反转整体
        reverse(chars,0,chars.length-1);
        //再反转前部分
        reverse(chars,0,chars.length-1-n);
        //再反转后部分
        reverse(chars,chars.length-n,chars.length-1);
        return new String(chars);
    }

    public void reverse(char[] chars, int left, int right) {
       for(;left<right;left++){
           char temp=chars[left];
           chars[left]=chars[right];
           chars[right]=temp;
           right--;
       }
    }
}

题目6:28. 找出字符串中第一个匹配项的下标
思路:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值