题解 | #回文数索引#

回文数索引

https://www.nowcoder.com/practice/b6edb5ca15d34b1eb42e4725a3c68eba

解题思路

这是一道关于回文串的题目,主要思路如下:

  1. 首先判断原字符串是否为回文串,如果是则输出-1
  2. 如果不是回文串,则尝试删除每一个位置的字符,判断剩余字符串是否构成回文串
  3. 一旦找到一个位置,删除该位置的字符后能构成回文串,则输出该位置索引
  4. 判断回文串的方法是从两端向中间比较字符是否相同

代码

#include <iostream>
#include <string>
using namespace std;

bool isPalindrome(string& s) {
    int n = s.length();
    for(int i = 0; i < n/2; i++) {
        if(s[i] != s[n-1-i]) return false;
    }
    return true;
}

int main() {
    int T;
    cin >> T;
    while(T--) {
        string s;
        cin >> s;
        
        // 如果已经是回文串
        if(isPalindrome(s)) {
            cout << -1 << endl;
            continue;
        }
        
        // 尝试删除每个位置的字符
        for(int i = 0; i < s.length(); i++) {
            string temp = s.substr(0, i) + s.substr(i+1);
            if(isPalindrome(temp)) {
                cout << i << endl;
                break;
            }
        }
    }
    return 0;
}
import java.util.*;

public class Main {
    static boolean isPalindrome(String s) {
        int n = s.length();
        for(int i = 0; i < n/2; i++) {
            if(s.charAt(i) != s.charAt(n-1-i)) return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while(T-- > 0) {
            String s = sc.next();
            
            if(isPalindrome(s)) {
                System.out.println(-1);
                continue;
            }
            
            for(int i = 0; i < s.length(); i++) {
                String temp = s.substring(0, i) + s.substring(i+1);
                if(isPalindrome(temp)) {
                    System.out.println(i);
                    break;
                }
            }
        }
    }
}
def is_palindrome(s):
    return all(s[i] == s[len(s)-1-i] for i in range(len(s)//2))

T = int(input())
for _ in range(T):
    s = input()
    
    # 如果已经是回文串
    if is_palindrome(s):
        print(-1)
        continue
    
    # 尝试删除每个位置的字符
    for i in range(len(s)):
        temp = s[:i] + s[i+1:]
        if is_palindrome(temp):
            print(i)
            break

算法及复杂度

  • 算法:暴力枚举 + 回文串判断
  • 时间复杂度: - 为测试用例数, 为字符串长度
  • 空间复杂度: - 需要存储原始字符串和临时字符串
全部评论

相关推荐

2025-12-27 18:11
已编辑
门头沟学院 前端工程师
28双非鼠鼠第一份实习,感谢金山,感谢面试官张先生的赏识,也感谢自己很开心很开心(有没有待过的前辈,求摸鱼技巧bushi)timeline12.15&nbsp;投递12.16&nbsp;约面12.18&nbsp;一面&nbsp;半个小时后约二面12.19&nbsp;二面,口头oc12.24&nbsp;发offer一面1.&nbsp;开发页面中使用的布局方式2.&nbsp;flex:&nbsp;1&nbsp;是什么的缩写3.&nbsp;水平居中的方法4.&nbsp;tailwindcss&nbsp;的优势5.&nbsp;js&nbsp;的闭包6.&nbsp;打印结果的题,解释为什么(var&nbsp;定义&nbsp;i&nbsp;,setTimeout&nbsp;执行打印),使用&nbsp;let&nbsp;的打印结果7.&nbsp;箭头函数和普通函数的区别8.&nbsp;promise&nbsp;构造函数是同步还是异步9.&nbsp;内存泄漏的情况10.&nbsp;interface&nbsp;和&nbsp;type&nbsp;的区别11.&nbsp;react&nbsp;的&nbsp;key&nbsp;作用12.&nbsp;常用的钩子函数13.&nbsp;怎么避免不必要的渲染14.&nbsp;useeffect&nbsp;的使用场景15.&nbsp;react&nbsp;和&nbsp;vue&nbsp;怎么选择16.&nbsp;vue&nbsp;的&nbsp;data&nbsp;为什么用函数17.&nbsp;tcp&nbsp;为什么需要三次握手和四次挥手18.&nbsp;vite&nbsp;为什么比较快19.&nbsp;解释防抖节流和手写防抖函数,还有实现思路20.&nbsp;深浅拷贝的区别和手写深拷贝,讲实现思路反问了业务,反馈时间和学习建议二面基本上是围绕项目展开,根据项目的每一项,来给场景题问你会怎么做,跟基础相关的东西如下:1.&nbsp;虚拟列表的实现和原理2.&nbsp;zustand&nbsp;和&nbsp;context&nbsp;的区别3.&nbsp;vitest&nbsp;相关,写测试的话应该怎么做些什么?4.&nbsp;monorepo的细节问题5.&nbsp;做项目的动机6.&nbsp;事件委托和时间冒泡的区别有个点顺着问了我五个问题实在是答不下去了就是说感觉金山云这边面试虽然一面全是八股,但是二面还是要好好准备项目,做到能被深挖那么两三个问题的程度,鼠鼠也是运气很好,问的都是准备过的嘻嘻面试完之后还很期待这个面试官会不会是我mt或者ld,会很认真的听我说话,然后告诉我哪里有小问题,不知道是不是鼠鼠的错觉,感觉他看后辈的眼神都是带有欣赏的意味真的很复合我对mt/ld的幻想(bushi),但是后来发现他ip是北京的qwq有点点小失落,不过没关系,看隔壁某书感觉金山的节奏还挺慢的期待入职ing愿一切顺利,好运常伴吾身这里再吐槽一下流程,怎么!!这么!!慢!!急死我了急死我了!!鬼知道我从周一到接到offer这段时间有多煎熬,哎呀但是但是好在一切如愿
发面经攒人品
点赞 评论 收藏
分享
01-09 17:12
四川大学 Java
叁六玖:上次建行给我开25万,让我扣2办理
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务