LeetCode中翻转字符串的总结

方法

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

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

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

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);

    }






}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值