代码编织梦想

✨hello,愿意点进来的小伙伴们,你们好呐!
✨ 🐻🐻系列专栏:【力扣刷题篇】
🐲🐲本篇内容:字符串刷题篇
🐯🐯作者简介:一名现大二的三非编程小白

1.最长公共前缀

链接: 最长公共前缀
在这里插入图片描述

对于该题,有以下两种解法:
1.纵向判断:
在这里插入图片描述
我们可以遍历数组中的字符串,对字符串的每一个字符都进行一一比对,判断最长公共前缀。
那要怎么实现对字符串中字符的一一判断呢?
我们可以定义一个整型变量来存放数组中第一个字符串的长度,并使用for循环遍历该字符串,将该字符串的每一个字符取出来,又进行for循环遍历其余的字符串,判断是否字符不同或者已经遍历到最短字符串的最后一个字符,返回第一个字符串的截取字符,若遍历完没有返回,则返回第一个字符串。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0){
            return "";
        }

        int length = strs[0].length();
        int count = strs.length;
        for(int i = 0;i < length;i++){
            char ch = strs[0].charAt(i);
            for(int j = 1;j < count;j++){
                if(i == strs[j].length() || ch != strs[j].charAt(i)){
                    return strs[0].substring(0,i);
                }
            }
        }
        return  strs[0];
    }
}

解法2:横向判断
在这里插入图片描述

我们可以用横向判断,对比找到两个字符串之间最长公共前缀,将该判断写成一个方法。用for循环来调用该方法对字符串寻找公共前缀

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0){
            return "";
        }
        String tmp = strs[0];
        for(int i = 1;i < strs.length ;i++){
            tmp = longestCommonPrefix(tmp,strs[i]);
        }
        return tmp;
    }

    public String longestCommonPrefix(String str1, String str2){
        int length = Math.min(str1.length(),str2.length());
        int index = 0;
        while(index < length && str1.charAt(index) == str2.charAt(index)){
            index++;
        }
        return str1.substring(0,index);
    }
}

2. 反转字符串中的单词

链接: 反转字符串中的单词
在这里插入图片描述
刚看到这道题的时候我想了一个很low的办法,我们可以先将字符串的前后空格和字符串中多余的空格去掉,再将字符串整体反转,最后将一个个单词反转。虽然Java中有该类库,但是我还是自己实现了这些方法。

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = trimSpaces(s);
        reverse(sb,0,sb.length() - 1);
        reverseEachWord(sb);
        return sb.toString();
    }

    public StringBuilder trimSpaces(String s){//去除前后空格
        StringBuilder stringBuilder = new StringBuilder();
        int i = 0;
        while(s.charAt(i) == ' '){
            //前面空格
            i++;
        }
        int j = s.length() - 1;
        while(s.charAt(j) == ' '){
            j--;
        }
        while(i <= j){
            char ch = s.charAt(i);
            if(ch != ' '){
                stringBuilder.append(ch);
            }else if(stringBuilder.charAt(stringBuilder.length() - 1) != ' '){
                stringBuilder.append(ch);
            }
            i++;
        }
        return stringBuilder;
    }

    public void reverse(StringBuilder sb, int left, int right){//字符串翻转
        while(left < right){
            char tmp = sb.charAt(left);
            sb.setCharAt(left,sb.charAt(right));
            sb.setCharAt(right,tmp);
            left++;
            right--;
        }

    }

    public void reverseEachWord(StringBuilder sb){//翻转字符串单词
        int length = sb.length();
        int state = 0;
        int end = 0;
        while(state < length){
            while(end < length  && sb.charAt(end) != ' '){
                end++;
            }
            reverse(sb,state,end - 1);
            end++;
            state = end;
        }
    }
}

但是我们会发现这种思路的空间复杂度和时间复杂度都较高,而且运用Java的类库就可以实现,有没有更巧妙的方法呢?当然是有的啦。

思路:
1. 我们也要先将字符串前后空格去除,然后定义双指针,指向最左和最右,再定义index先等于右指针。
在这里插入图片描述
2. 我们要通过遍历让index指向right的前一个空格,找到最后的一个单词。 在这里插入图片描述
3. 然后for循环中将该单词存储到StringBuffer变量中。
4. 然后判断要存储的是否为该字符串的第一个单词,若不是则存入一个空格。
5. 最后让right = index ,重新进行遍历查找。

class Solution {
    public String reverseWords(String s) {
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            ++left;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            --right;
        }

        StringBuffer sb = new StringBuffer();
        int index = right;
        while(left <= right){
            while(index >= left && s.charAt(index) != ' '){//找到范围
                index--;
            }
            
            for(int i = index + 1;i <= right;i++){
                sb.append(s.charAt(i));
            }
            if(index > left){
                sb.append(' ');
            }
            
            while(index >= left && s.charAt(index) == ' '){
                index--;
            }
            right = index;
        }

        return sb.toString();
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_62547912/article/details/127153724

力扣刷题记录#字符串#简单#383赎金信-爱代码爱编程

题目描述 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false

C++力扣刷题记录——字符串(持续更新)-爱代码爱编程

string的有用的常用操作 a[n],从0开始的 for(auto c : string) string s2=s.substr(0,5) or (6)从下标6开始 s.append(args) 类似vector的push_back() s.replace(range,args)在范围range内替换 其中args可以指str,pos,len或者n,c

力扣刷题总结-字符串翻转-爱代码爱编程

1、给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 2、输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a studen

力扣刷题系列——字符串相关-爱代码爱编程

字符串相关算法题 1.有效的字母异位词 力扣242:https://leetcode-cn.com/problems/valid-anagram/description/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram"输出: true示

力扣刷题—字符串-爱代码爱编程

1.14. 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 1.解题思路(横向对比) 1.新建变量comm储存当前的公共前缀,初始化为字符串数组的元素;2.对每一个字符串s进行遍历,comm与s的字符从前向后进行比较,遇到不同的时跳出;3.当公共部分长度为0时,跳出。class

力扣刷题笔记:字符串(11)-爱代码爱编程

8. 字符串转换整数 (atoi)(自动机) 逐位判断,并且考虑各种情况 1、首先去掉头部,包括去掉空格和其他符号,直到碰到加减号或者数字 2、设置正负flag,如果是负号则flag为-1 3、用一个long型的ans从字符串最高位开始记录,一边记录一边乘以10,如果超过范围就返回INT_MAX class Solution { public:

力扣刷题之字符串-爱代码爱编程

力扣刷题之字符串 6.Z字形变换8.字符串转换整数(atoi)12.整数转罗马数字13.罗马数字转整数14.最长公共前缀22.括号生成28.实现strStr()38.外观数列43.字符串相乘49.字母异味词分组58.最后一个单词的长度67.二进制求和71.简化路径91.解码方法(青蛙跳台阶)93.复原IP地址97.交错字符串125.验证回文串151

力扣刷题记录_字符串(自学)-爱代码爱编程

字符串 一、字符串1、反转字符串(力扣344)2、反转字符串 II(力扣541)3、替换空格(剑指 Offer 05)4、翻转字符串里的单词(力扣151)5、左旋转字符串(剑指 Offer 58 - II)6、实现 strStr()(力扣28)7、重复的子字符串(力扣459) 一、字符串 1、反转字符串(力扣344) public voi

力扣刷题——字符串篇KMP算法( 28. 实现 strStr(),459.重复的子字符串)-爱代码爱编程

28. 实现 strStr() 题目 力扣题目链接 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = "hello", needle = "ll

[力扣刷题]左旋字符串实现-爱代码爱编程

老规矩,先看题: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1: 输入: s = “abcdefg”, k = 2 输出: “cdefgab” 示例 2: 输入: s = “lrlo

《力扣刷题》 分割字符串的最大得分-爱代码爱编程

题目描述 若存在一个由若干 0 和 1 组成的字符串 s ,需要计算并返回将该字符串分割成两个非空子字符串(左子字符串和右子字符串)所能获得的最大得分 「分割字符串的得分」为左子字符串中 0 的数量加上右子字符串中 1 的数量 C 语言具体代码实现 如下是我在力扣里无法通过编译的代码,但是可能在 dev编译器中通过!!! 将 int len

力扣每日一题刷题总结:字符串篇(持续更新)_villanelle#的博客-爱代码爱编程

953. 验证外星语词典 Easy 字典 2022/5/17 某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。 给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。 示例: 输入:wo

力扣刷题日志——字符串_crisp制药的博客-爱代码爱编程

文章目录 替换空格反转字符串移除元素 替换空格 首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,right指向新长度的末尾,left指向旧长度的末尾

力扣刷题日志——字符串和栈_crisp制药的博客-爱代码爱编程

文章目录 有效的括号反转字符串中的单词左旋转字符串 有效的括号 在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了 isEmpty()是空的时候返回 1,否则返回

javascript力扣刷题——简单字符串(一)_javascript 刷题 免费-爱代码爱编程

20. 有效的括号 符号匹配使用栈的思想,已做。 937. 重新排列日志文件 indexOf(要检查的字符串) 方法可返回某个指定的字符串值在字符串中首次出现的位置。stringObject.slice(start,end)方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。 var reorderLogFiles = function(l

《力扣刷题》 字符串中的单词数_统计单词在字符串出现的次数力扣-爱代码爱编程

题目描述 存在一个字符数组,要求我们将其中的单词数量返回         计算字符串中单词的数量,就等同于计数单词的第一个下标的个数,因此,我们只需要遍历整个字符串,统计每个单词的第一个下标的数目即可 满足单词的第一个下标有以下两个条件:         1. 该下标对应的字符不为空格         2. 该下标为初始下标或者该下标的前下标对应