跳至主要內容

917. 仅仅反转字母


917. 仅仅反转字母

🟢   🔖  双指针 字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

Given a string s, reverse the string according to the following rules:

  • All the characters that are not English letters remain in the same position.
  • All the English letters (lowercase or uppercase) should be reversed.

Return s after reversing it.

Example 1:

Input: s = "ab-cd"

Output: "dc-ba"

Example 2:

Input: s = "a-bC-dEf-ghIj"

Output: "j-Ih-gfE-dCba"

Example 3:

Input: s = "Test1ng-Leet=code-Q!"

Output: "Qedo1ct-eeLg=ntse-T!"

Constraints:

  • 1 <= s.length <= 100
  • s consists of characters with ASCII values in the range [33, 122].
  • s does not contain '\"' or '\\'.

题目大意

给你一个字符串 s ,根据下述规则反转字符串:

  • 所有非英文字母保留在原有位置。
  • 所有英文字母(小写或大写)位置反转。

返回反转后的 s

示例 1:

输入: s = "ab-cd"

输出: "dc-ba"

示例 2:

输入: s = "a-bC-dEf-ghIj"

输出: "j-Ih-gfE-dCba"

示例 3:

输入: s = "Test1ng-Leet=code-Q!"

输出: "Qedo1ct-eeLg=ntse-T!"

提示

  • 1 <= s.length <= 100
  • s 仅由 ASCII 值在范围 [33, 122] 的字符组成
  • s 不含 '\"''\\'

解题思路

可以使用双指针的方法,分别从字符串的两端向中间扫描,遇到字母时进行交换。

  1. 定义辅助函数
    定义一个 isLetter 函数,用于判断字符是否是字母(大小写均可)。

  2. 初始化双指针

    • left 指针从字符串的开头开始。
    • right 指针从字符串的末尾开始。
  3. 扫描和交换

    • 如果 leftright 所指向的字符中有非字母字符,则分别向内移动相应的指针,直到找到字母。
    • 如果两指针指向的字符均为字母,则交换它们。
    • 然后继续移动指针,重复上述步骤,直到 left >= right
  4. 返回结果

    • 将经过处理的数组转换回字符串并返回。

复杂度分析

  • 时间复杂度O(n),遍历字符串一次。
  • 空间复杂度O(n),使用了一个字符数组。

代码

/**
 * @param {string} s
 * @return {string}
 */
var reverseOnlyLetters = function (s) {
	const isLetter = (char) => {
		return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z');
	};
	let arr = s.split('');
	let left = 0,
		right = arr.length - 1;
	while (left < right) {
		while (left < right && !isLetter(arr[left])) {
			left++;
		}
		while (left < right && !isLetter(arr[right])) {
			right--;
		}
		let temp = s[left];
		arr[left] = arr[right];
		arr[right] = temp;
		left++;
		right--;
	}
	return arr.join('');
};

相关题目

题号标题题解标签难度力扣
2810故障键盘字符串 模拟🟢🀄️open in new window 🔗open in new window