关于字符串算法总结

33 篇文章 1 订阅
29 篇文章 3 订阅

关于字符串算法总结

字符,String 是由一系列字符组成的。字符的类型是char,可能有216 个值。

常用函数

  • charAt() - 索引

  • length() - 长度

  • substring() - 提取子串

  • StringBuilder - 连接

  • char[] - 字符串数组

    转换方式 :s.toCharArray()

Leetcode

344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

异或:^

首先 a = a, b = b
令a = a^b;
则
b = a^b = a^b^b = a
a = a^b = a^b^a = b
class Solution {
    public void reverseString(char[] s) {
        int start = 0;
        int end = s.length-1;
        while(start < end){
           s[start] ^= s[end];
           s[end] ^= s[start];
           s[start] ^= s[end]; 
           start ++;
           end --;
        }
    }
}

541. 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i< ch.length; i += 2*k){
            int start = i;
            int end = Math.min(start+k-1,s.length()-1);
            while(start < end){
                ch[start] ^= ch[end];
                ch[end] ^= ch[start];
                ch[start] ^= ch[end];
                end --;
                start ++;
            }
            
        }
        return new String(ch);
    }
}

剑指 Offer 05. 替换空格 - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
    public String replaceSpace(String s) {
        StringBuilder str = new StringBuilder();
        for(int i =0; i< s.length();i++){
            if(s.charAt(i) ==' ') str.append("%20");
            else str.append(s.charAt(i));
        }  
        return str.toString();
    }
}

151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)

  1. 移除多余空格
  2. 将整个字符串反转
  3. 将每个单词反转
class Solution {
    public String reverseWords(String s) {
        char[] str = s.toCharArray();//源数组
        //新建一个数组
        char[] newstr = new char[str.length+1];
        int index = 0;
        int i = str.length-1;
        for(;i>=0;i--){
            while(i>=0 && str[i] == ' ') i--;
            int right = i;
            while(i>=0 &&str[i] != ' ') i--;
            for(int j = i+1;j<=right;j++){
                newstr[index++] = str[j];
                if(j == right) newstr[index++] = ' ';
            }   
        }
        if(index == 0) return "";
        else return new String(newstr,0,index-1);
     }
}

剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串
class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb=new StringBuilder(s);
        reverseString(0,n-1,sb);
        reverseString(n,s.length()-1,sb);
        return sb.reverse().toString();
    }
    public void reverseString(int start,int end,StringBuilder sb){
        while(start <  end){
            char temp = sb.charAt(start);
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start ++;
            end --;
        }
    }
}

朴素解法

28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
    public int strStr(String haystack, String needle) {
        int n = haystack.length(), m = needle.length();
        char[] s = haystack.toCharArray(), p = needle.toCharArray();
        // 枚举原串的「发起点」
        for (int i = 0; i <= n - m; i++) {
            // 从原串的「发起点」和匹配串的「首位」开始,尝试匹配
            int a = i, b = 0;
            while (b < m && s[a] == p[b]) {
                a++;
                b++;
            }
            // 如果能够完全匹配,返回原串的「发起点」下标
            if (b == m) return i;
        }
        return -1;
    }
}

KMP算法

代码随想录讲解的KMP算法B站视频:帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili

主要理解:

  • 前缀后缀
  • next数组的构造方法
  • 前缀表和next数组之间的关系
  • 使用next数组来匹配

28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com)

class Solution {
    public int strStr(String haystack, String needle) {
        if(needle.length() == 0) return 0;
        int n = haystack.length();
        int m = needle.length();
        String ss = " " + haystack; //增加哨兵空格,使其从下标1开始
        String pp = " " + needle;
        char[] s= ss.toCharArray();
        char[] p = pp.toCharArray();
		//构造next数组
        int[] next = new int[m+1];
        for(int i=2,j=0;i<=m;i++){
            //匹配不成功则,j = next[j];
            while(j>0 && p[i] != p[j+1]) j = next[j];
            if(p[i] == p[j+1]) j++;//成功则j++
            next[i] = j;//更新next数组
        }
		//匹配
        for(int i =1,j=0;i<=n;i++){
            while(j>0&& s[i] != p[j+1]) j = next[j];//匹配不成功
            if(s[i] == p[j+1]) j++;//匹配成功 j++;
            if(j == m) return i-m;//j = m 时,也就是说匹配串全部被匹配上时,返回下标
            
        }
        return -1;
    }   
}

459. 重复的子字符串 - 力扣(LeetCode) (leetcode-cn.com)

指路:leetcode-master/0459.重复的子字符串.md at master · youngyangyang04/leetcode-master (github.com)

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        if(s.isEmpty()) return false;
        int n = s.length();
        String ss = " " + s;//增加哨兵,使其从1开始
        char[] chars = ss.toCharArray();
        int[] next = new int[n+1];
        //构造next
        for(int i =2,j=0;i<=n;i++){
            while(j>0 && chars[i] != chars[j+1]) j = next[j];
            if(chars[i] == chars[j+1]) j++;
            next[i] = j;
        }
        if(next[n] >0 && n%(n-next[n]) == 0) return true;
        return false;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小七rrrrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值