Leetcode 刷题 -- 双指针字符串

用双指针方法解决字符串问题,是比较常见的一种处理方式;

344.反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

//反转的模板代码
class Solution {
    public void reverseString(char[] s) {
    int n = s.length;
    int i = 0;
    int j = n-1;
    //从头到尾
    //从尾到头
    //交换
   while(i<j){
       char temp = s[i];
       s[i] = s[j];
       s[j] = temp;
       i++;
       j--;
   }
}
}

345. 反转字符串中的元音字母

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

示例 1:
输入: “hello”
输出: “holle”

示例 2:
输入: “leetcode”
输出: “leotcede”

class Solution {
    public String reverseVowels(String s) {
    //将元音字母放到Set集合中,便于判断
    Set<Character> set = new HashSet <>(Arrays.asList('A','E','I','O','U','a','e','i','o','u'));
    //双指针,一个从尾到头,一个从头到尾
    int i = 0;
    int j = s.length()-1;
    char[] sArr = s.toCharArray();
    while(i<j){
        //找到两个元音字母
        while(i<j &&!set.contains(sArr[i])){
            i++;
        }
        while(i<j &&!set.contains(sArr[j])){
            j--;
        }
        //交换
       if(sArr[i]!=sArr[j]){
           char temp = sArr[i];
           sArr[i] = sArr[j];
           sArr[j] = temp;
       }
       i++;
       j--;
    }
    return String.valueOf(sArr);
    }
}

541. 反转字符串Ⅱ

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

class Solution {
    public String reverseStr(String s, int k) {
    //此题关键在于找出反转哪一部分
     //反转2k个字符的前k个
     int n = s.length();
     int times = 1; //轮次
     char[] sArr = s.toCharArray();
     //遍历字符串数组
     //确定反转的界限
     for(int i = 0; i<n ;){
     int j = Math.min(n, times*2*k);
     int dif = j-i;
     if(dif<k){
         //全部反转
         //调用反转函数
         reverse(sArr, i ,j-1);
     }else{
         //只反转k个字符
         reverse(sArr, i ,i+k-1);
     }
     times++;
     i=j;
     }
     return String.valueOf(sArr);
    }
    public void reverse(char[] sArr , int start, int end){
        int i = start;
        int j = end;
        while(i<j){
            char temp = sArr[i];
            sArr[i] = sArr[j];
            sArr[j] = temp;
            i++;
            j--;
        }
    }
}

你可能感兴趣的:(LeetCode刷题)