leecode 541. 反转字符串 II

本文介绍了一种解决LeetCode上541.反转字符串II问题的算法实现,通过定义翻转函数并结合不同条件下的翻转逻辑,实现了对字符串中特定部分的翻转操作。

541. 反转字符串 II

不看答案这题做起来是真麻烦,而且最后也没做对,只能精通cv了。

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        // 1. 每隔 2k 个字符的前 k 个字符进行反转
        for (int i = 0; i< ch.length; i += 2 * k) {
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= ch.length) {
                reverse(ch, i, i + k -1);
                continue;
            }
            // 3. 剩余字符少于 k 个,则将剩余字符全部反转
            reverse(ch, i, ch.length - 1);
        }
        return  new String(ch);

    }
    // 定义翻转函数
    public void reverse(char[] ch, int i, int j) {
    for (; i < j; i++, j--) {
        char temp  = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
    }

    }
}

### Java String 使用方法 #### 1. 创建字符串Java 中,创建字符串有多种方式。最常见的是直接使用字符串字面量,也可以使用 `String` 类的构造函数。 ```java // 使用字符串字面量 String str1 = "Hello"; // 使用构造函数 String str2 = new String("World"); ``` #### 2. 字符串连接 可以使用 `+` 运算符或 `concat()` 方法来连接字符串。 ```java String str3 = str1 + " " + str2; String str4 = str1.concat(" ").concat(str2); ``` #### 3. 获取字符串长度 使用 `length()` 方法获取字符串的长度。 ```java int length = str3.length(); ``` #### 4. 访问字符串中的字符 使用 `charAt()` 方法可以访问字符串中指定位置的字符。 ```java char ch = str3.charAt(0); ``` #### 5. 字符串比较 使用 `equals()` 方法比较两个字符串的内容是否相等,使用 `==` 比较两个字符串是否引用同一个对象。 ```java boolean isEqual = str1.equals("Hello"); ``` #### 6. 字符串查找 使用 `indexOf()` 方法查找子字符串在原字符串中第一次出现的位置。 ```java int index = str3.indexOf("World"); ``` #### 7. 字符串截取 使用 `substring()` 方法截取字符串的一部分。 ```java String subStr = str3.substring(0, 5); ``` #### 8. 字符串替换 使用 `replace()` 方法替换字符串中的字符或子字符串。 ```java String replacedStr = str3.replace("World", "Java"); ``` #### 9. 字符串大小写转换 使用 `toUpperCase()` 和 `toLowerCase()` 方法进行大小写转换。 ```java String upperCaseStr = str3.toUpperCase(); String lowerCaseStr = str3.toLowerCase(); ``` ### LeetCodeJava String 的考察方式 #### 1. 字符串匹配问题 例如 LeetCode 28 题实现 `strStr()` 函数,需要在一个字符串中查找另一个字符串第一次出现的位置。 ```java class Solution { public int strStr(String haystack, String needle) { return haystack.indexOf(needle); } } ``` #### 2. 字符串反转问题 LeetCode 344 题反转字符串,要求反转一个字符数组表示的字符串。 ```java class Solution { public void reverseString(char[] s) { int left = 0, right = s.length - 1; while (left < right) { char temp = s[left]; s[left] = s[right]; s[right] = temp; left++; right--; } } } ``` #### 3. 字符串分割与组合问题 LeetCode 17 题电话号码的字母组合,需要根据电话号码的数字组合生成所有可能的字母组合。 ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Solution { Map<Character, String> phoneMap = new HashMap<Character, String>() {{ put('2', "abc"); put('3', "def"); put('4', "ghi"); put('5', "jkl"); put('6', "mno"); put('7', "pqrs"); put('8', "tuv"); put('9', "wxyz"); }}; List<String> output = new ArrayList<String>(); public List<String> letterCombinations(String digits) { if (digits.length() != 0) { backtrack("", digits); } return output; } public void backtrack(String combination, String nextDigits) { if (nextDigits.length() == 0) { output.add(combination); } else { char digit = nextDigits.charAt(0); String letters = phoneMap.get(digit); for (int i = 0; i < letters.length(); i++) { String letter = letters.substring(i, i + 1); backtrack(combination + letter, nextDigits.substring(1)); } } } } ``` #### 4. 字符串的回文问题 LeetCode 5 题最长回文子串,需要找出一个字符串中的最长回文子串。 ```java class Solution { public String longestPalindrome(String s) { if (s == null || s.length() < 1) { return ""; } int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); int len2 = expandAroundCenter(s, i, i + 1); int len = Math.max(len1, len2); if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } private int expandAroundCenter(String s, int left, int right) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } return right - left - 1; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值