LeetCode中翻转字符串的总结

本文详细解析了LeetCode上多个字符串翻转题目,包括整体字符串翻转、按组翻转、单词翻转及元音字母翻转,提供了双指针等高效算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法

  • 将字符串转换为字符数组

  • 一般可以采用双指针对数组进行遍历

    • 若是对整个字符串进行翻转,则需要定义整个字符串的首尾指针
    • 若是对字符串中的一个个单词,则指针需要对字符穿中的一个个单词进行,(关键是如何判别单词,根据空格对字符串中的一个个单词进行区分)
  • 最后将处理完的数组转换为字符串

LeetCode344翻转字符串

翻转字符串(简单的对字符串进行翻转
在这里插入图片描述

首尾指针,双向推进对字符串进行中的元素进行交换




  public void reverseString(char[] s) {
  int left = 0;
        int right = s.length-1;
        
        while (left<right) {
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
              left++;
            right--;
        }
    }
  

LeetCode541 翻转字符串II(2k为一组)

翻转字符串(k个一组翻转)>>>
在这里插入图片描述

  • 采用双指针的方式,对字符串转换为数组之后,再对其进行2k个位一组进行翻转

package com.zj.IString;


/**
 * @Author zhoujian
 * @Date 2020/8/24 22:57
 * 给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
 * (1)如果剩余字符少于 k 个,则将剩余字符全部反转。
 * (2)如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
 */
public class Problem541 {

    /**
     * 翻转
     * @param s
     * @param k
     * @return
     */
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        // 每2k个元素为一组进行翻转
        for(int i=0;i<n;i+=2*k){
            int left = i;
            //判断下标是否越界
            int right = i+k-1<n?i+k-1:n-1;
            // 双指针交换
            while (left<right){
                char temp = chars[left];
                chars[left++] = chars[right];
                chars[right--] = temp;
            }
        }
        return String.valueOf(chars);
    }
}


LeetCode557 翻转字符串中的单词

在这里插入图片描述

  • 采用双指针的方式,对字符串的媒体哥单词进行收尾交换进行收尾的交换
  • 采用递归的方式解决

package com.zj.IString;

/**
 * @Author zhoujian
 * @Date 2020/8/25 9:28
 */
public class Problem557 {

    /**
     * 翻转字符串里的单词
     *  采用双指针的方法
     * @param s
     * @return
     */
    public String reverseWords1(String s) {
        int left = 0;
        int right = 0;
        char[] t = s.toCharArray();
        while (right<s.length()){
            // 找到第一个空格
            while (right<t.length&&t[right]!=' '){right++;}
            // 交换left和right-1之间的元素
            int end = right+1;
            right--;
            if(right<t.length) {
                while (left < right){
                    char temp = t[left];
                    t[left]=t[right];
                    t[right]=temp;
                    left++;
                    right--;
                }
            }
            left=right=end;
        }
        return new String(t);
    }


    // 采用递归的方法
    public String reverseWords(String s) {

        char[] arr = s.toCharArray();
        dfs(arr,0);
        return new String(arr);
    }

    public void dfs(char[] arr,int start){
        if(start>=arr.length) return;
        // 找到第一个空格
        int end = start;
        while (end<arr.length&&arr[end]!=' '){
            end++;
        }
        dfs(arr,end+1);
        // 将start于end-1之间的元素进行交换
        int right = end-1;
        while (start<right){
            char temp = arr[start];
            arr[start]=arr[right];
            arr[right]=temp;
            start++;
            right--;
        }
    }





    public static void main(String[] args) {
            String s = "Let's take LeetCode contest";
            Problem557 problem557 = new Problem557();
        String reverseWords = problem557.reverseWords(s);
        System.out.println(reverseWords);
    }

}



LeetCode151 翻转字符串里的单词(单词不需要翻转)

翻转字符串里的单词
1在这里插入图片描述

  • 采用双指针的方式对数组一句空格对数组进行遍历,以此来区分单词
package com.zj.IString;

/**
 * @Author zhoujian
 * @Date 2020/8/24 19:42
 */
public class Problem151 {
    /**
     * 翻转字符串里的单词
     * @param s
     * @return
     * 双指针
     */
    public String reverseWords(String s) {

        // 倒序遍历字符串s,记录单词左右索引边界i,j
        // 每确定一个单词的边界,则将其加入值单词列表res中
        // 最终将单词列表拼接位字符串并返回即可
        s = s.trim();
        int j = s.length()-1,i=j;
        StringBuilder res = new StringBuilder();
        while (i>=0){
            while(i>=0&&s.charAt(i)!=' ') i--;//搜索收个空格
            res.append(s.substring(i+1,j+1)+" ");//添加单词
            while(i>=0&&s.charAt(i)==' ') i--;//跳过单词间劲歌
            j = i;//j指向下个单词的为字符
        }
        return res.toString().trim();
    }


}



LeetCode345 翻转字符串中的元音字母

翻转字符串中的元音字母

在这里插入图片描述

采用收尾指针,对字符串进行遍历,找到元音字母就进行交换



package com.zj.IString;

/**
 * @Author zhoujian
 * @Date 2020/8/24 20:28
 */
public class Problem345 {

    /**
     *
     * @param s
     * @return
     */
    public String reverseVowels(String s) {

        char[] source = s.toCharArray();
        int left =0 ;
        int right = s.length()-1;
        String t = "aeiouAEIOU";

        while (left<right){

            // 找到s
            while (left<right&&!t.contains(source[left]+"")) left++;
            while (left<right&&!t.contains(source[right]+"")) right--;
            if(left<right){
                char temp = source[left];
                source[left]=source[right];
                source[right]=temp;
            }
            left++;
            right--;
        }
        return new String(source);
    }

    public static void main(String[] args) {
        String s = "leetcode";
        Problem345 problem345 = new Problem345();
        String reverseVowels = problem345.reverseVowels(s);
        System.out.println(reverseVowels);

    }






}


### C语言实现LeetCode 151题(反转字符串中的单词) 对于给定的任务,在C语言中解决该问题的一种方法是通过手动处理字符串并利用辅助函数来完成特定操作。下面展示了一种可能的解决方案,其中包含了如何定义必要的功能以及它们是如何协同工作的解释。 #### 完整代码示例 ```c #include <stdio.h> #include <string.h> void trim(char *str) { char *end; while (isspace((unsigned char)*str)) str++; end = str + strlen(str) - 1; while(end > str && isspace((unsigned char)*end)) end--; *(end+1) = '\0'; } void reverseString(char* start, char* end){ while(start<end){ char temp=*start; *start++=*end; *end--=temp; } } char* reverseWords(char* s) { int length=strlen(s); if(length==0)return ""; // Trim leading and trailing spaces trim(s); char *result=(char*)malloc(strlen(s)+2); // Extra space for potential extra space at the end and null terminator result[0]='\0'; char word[50]; // Assuming no single word will exceed this limit int index=0; for(int i=0;i<=length;i++){ if(i==length || s[i]==' '){ if(index>0){ reverseString(word,word+index-1); strcat(result,word); if(i!=length)strcat(result," "); memset(word,'\0',sizeof(word)); index=0; } }else{ word[index++]=s[i]; } } return result; } ``` 此程序首先移除了输入字符串两端多余的空白字符[^1]。接着遍历整个字符串,每当遇到空格或到达字符串结尾时,就调用`reverseString()`函数翻转当前收集到的一个完整的词,并将其追加到最终的结果串后面。为了防止最后多出必要的空格,在每次添加新词之前会检查当前位置是否为原字符串的实际末端位置[^2]。 注意这里假设单个词语长度会超过预设的最大值(这里是49),如果存在更长的情况,则需要调整数组大小或者采用动态分配的方式存储临时变量`word`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值