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
  • 否则同时向中间移动两个指针

需要注意的边界情况:

  1. 当字符串长度为奇数时,中间位置的字符总是与自己相等
  2. 当字符串长度为偶数时,需要检查所有对称位置

推荐解法: 直接遍历法,代码更简洁易懂。

代码实现

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)