IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 关于字符串算法总结 -> 正文阅读

[游戏开发]关于字符串算法总结

关于字符串算法总结

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

常用函数

  • charAt() - 索引

  • length() - 长度

  • substring() - 提取子串

  • StringBuilder - 连接

  • char[] - 字符串数组

    转换方式 :s.toCharArray()

Leecode

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;
    }
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:58:26  更:2022-03-15 23:04:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 17:35:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码