Easy
题目描述
给你一个长度为 n 的字符串 s,由小写英文字母组成。
返回最小的索引 i,使得 s[i] == s[n - i - 1]。
如果不存在这样的索引,返回 -1。
示例 1:
输入:s = "abcacbd"
输出:1
解释:在索引 i = 1 处,s[1] 和 s[5] 都是 'b'。
没有更小的索引满足条件,所以答案是 1。
示例 2:
输入:s = "abc"
输出:1
解释:在索引 i = 1 处,两个比较位置重合,所以两个字符都是 'b'。
没有更小的索引满足条件,所以答案是 1。
示例 3:
输入:s = "abcdab"
输出:-1
解释:对于每个索引 i,位置 i 和 n - i - 1 处的字符都不同。
因此,不存在有效索引,所以答案是 -1。
约束条件:
- 1 <= n == s.length <= 100
- s 由小写英文字母组成
提示:
- 使用双指针
解题思路
这道题要求找到字符串中满足 s[i] == s[n-i-1] 的最小索引。这实际上是在寻找字符串中从左边某个位置与其对称位置(从右边数)字符相等的第一个位置。
解题思路:
我们可以采用直接遍历的方法,从索引 0 开始逐个检查每个位置 i 是否满足 s[i] == s[n-i-1]。这种方法简单直观,时间复杂度为 O(n)。
另一种思路是使用双指针:
- 左指针 left 从 0 开始
- 右指针 right 从 n-1 开始
- 当
s[left] == s[right]时返回 left - 否则同时向中间移动两个指针
需要注意的边界情况:
- 当字符串长度为奇数时,中间位置的字符总是与自己相等
- 当字符串长度为偶数时,需要检查所有对称位置
推荐解法: 直接遍历法,代码更简洁易懂。
代码实现
class Solution {
public:
int firstMatchingIndex(string s) {
int n = s.length();
for (int i = 0; i < n; i++) {
if (s[i] == s[n - i - 1]) {
return i;
}
}
return -1;
}
};
class Solution:
def firstMatchingIndex(self, s: str) -> int:
n = len(s)
for i in range(n):
if s[i] == s[n - i - 1]:
return i
return -1
public class Solution {
public int FirstMatchingIndex(string s) {
int n = s.Length;
for (int i = 0; i < n; i++) {
if (s[i] == s[n - i - 1]) {
return i;
}
}
return -1;
}
}
var firstMatchingIndex = function(s) {
const n = s.length;
for (let i = 0; i < n; i++) {
if (s[i]
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |