news 2026/4/18 10:31:57

华为OD机试真题 - 没有回文串 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试真题 - 没有回文串 (C++ Python JAVA JS GO)

没有回文串

2025华为OD机试 - 华为OD上机考试 200分题型

华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目描述

回文串的定义:正读和反读都一样的字符串。

现在已经存在一个不包含回文串的字符串,字符串的字符都是在英语字母的前N个,且字符串不包含任何长度大于等于2的回文串;

请找出下一个字典序的不包含回文串的、字符都是在英语字母的前N个、且长度相同的字符串。

如果不存在,请输出NO。

输入描述

输入包括两行。

第一行有一个整数:N(1<=N<=26),表示字符串的每个字符范围都是前N的英语字母。

第二行输入一个字符串S(输入长度<=10000),输入保证这个字符串是合法的并且没有包含回文串。

输出描述

输出下一个字典序的不包含回文串的、字符都是在英语字母的前N个、且长度相同的字符串;

如果不存在,请输出”NO“。

用例1

输入

3 cba

输出

NO

题解

思路:贪心

  1. 回文串去掉首尾字母后,仍然是回文串,所以长度为m的回文串必然包含长为m-2的回文串。逆推可以得到如果字符串不包含m-2长度的回文串,就不会存在长为m的回文串。综合题目中描述的字符串不包含任何长度大于等于2的回文串, 可以推导出不包含长度2和长度3的回文串就不会包含回文串。
  2. 判断是否存在回文串就转换为如何判断不包含长度2和长度3的回文串,那这个就比较简单了,存在i如果s[i] == s[i+1] || s[i] == s[i+2]那就是存在了。
  3. 题目要求字典序最小,相应增大位置越靠右越好,这道题可以理解成s字符串的字符串n进制加数
  4. 这题可以采用贪心 + 类似进位:一开始对最右位执行+1操作,
    • 如果不与前1位、前2位相等则说明符合要求输出结果。
    • 一旦发生冲突则继续加,溢出就进位
      • 如果到最左边还出现溢出则说明不存在合法返回NULL。
      • 假设当前由于溢出到达index位置,并且index位置值不和前1前2位发生冲突,则说明index位已经合法代表[0,index]都是合法(不包含回文串)的,接下就是回溯考虑{index+1, s.size()-1}是否合法,这里就是循环遍历这个范围内所有位置是否和前两个值发生冲突,
        • 全部不发生冲突的话,说明合法,直接输出。
        • 假设x位置发生冲突的话,则继续重复上面发生冲突的逻辑处理即可。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; string handle(string s, int k) { k += 'a'; int n = s.size(); int i = n - 1; s[i]++; while (i < n) { // 需要进位 if (s[i] == k) { if (i == 0) { return "NO"; } // 进位 s[i] = 'a'; s[--i]++; } else if (i && s[i] == s[i-1] || i > 1 && s[i] == s[i-2]) { // 如果 s[i] 和左侧的字符形成回文串,就继续增加 s[i] s[i]++; } else { i++; } } return s; } int main() { string s; int k; cin >> k; cin >> s; string res = handle(s, k); cout << res; return 0; }

JAVA

import java.util.*; public class Main { static String handle(String s, int k) { char[] arr = s.toCharArray(); char limit = (char) ('a' + k); int n = arr.length; int i = n - 1; arr[i]++; // 从最后一位开始尝试递增 while (i < n) { // 需要进位 if (arr[i] == limit) { if (i == 0) { return "NO"; } arr[i] = 'a'; i--; arr[i]++; } // 如果当前字符与前1位或前2位形成回文 else if ((i >= 1 && arr[i] == arr[i - 1]) || (i >= 2 && arr[i] == arr[i - 2])) { arr[i]++; } // 当前位合法,处理下一位 else { i++; } } return new String(arr); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int k = sc.nextInt(); String s = sc.next(); System.out.println(handle(s, k)); } }

Python

defhandle(s,k):arr=list(s)limit=chr(ord('a')+k)n=len(arr)i=n-1arr[i]=chr(ord(arr[i])+1)# 最后一位递增whilei<n:# 需要进位ifarr[i]==limit:ifi==0:return"NO"arr[i]='a'i-=1arr[i]=chr(ord(arr[i])+1)# 与前1位或前2位形成回文elif(i>=1andarr[i]==arr[i-1])or\(i>=2andarr[i]==arr[i-2]):arr[i]=chr(ord(arr[i])+1)else:i+=1return''.join(arr)if__name__=="__main__":k=int(input().strip())s=input().strip()print(handle(s,k))

JavaScript

'use strict';constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letlines=[];rl.on('line',(line)=>{if(line!==null){lines.push(line.trim());}});rl.on('close',()=>{letidx=0;constk=parseInt(lines[idx++]);// 字母个数consts=lines[idx++];// 原字符串console.log(handle(s,k));});functionhandle(s,k){letarr=s.split('');letlimit=String.fromCharCode('a'.charCodeAt(0)+k);letn=arr.length;// 从最后一位开始尝试递增leti=n-1;arr[i]=String.fromCharCode(arr[i].charCodeAt(0)+1);while(i<n){// 需要进位if(arr[i]===limit){if(i===0){return"NO";}arr[i]='a';i--;arr[i]=String.fromCharCode(arr[i].charCodeAt(0)+1);}// 如果与前1位或前2位形成回文elseif((i>=1&&arr[i]===arr[i-1])||(i>=2&&arr[i]===arr[i-2])){arr[i]=String.fromCharCode(arr[i].charCodeAt(0)+1);}// 当前位合法,继续处理下一位else{i++;}}returnarr.join('');}

Go

packagemainimport("bufio""fmt""os")funchandle(sstring,kint)string{arr:=[]byte(s)limit:=byte('a'+k)n:=len(arr)i:=n-1arr[i]++// 从最后一位开始递增fori<n{// 需要进位ifarr[i]==limit{ifi==0{return"NO"}arr[i]='a'i--arr[i]++}elseif(i>=1&&arr[i]==arr[i-1])||(i>=2&&arr[i]==arr[i-2]){// 与前1位或前2位形成回文arr[i]++}else{i++}}returnstring(arr)}funcmain(){in:=bufio.NewReader(os.Stdin)varkintvarsstringfmt.Fscan(in,&k)fmt.Fscan(in,&s)fmt.Println(handle(s,k))}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:38:42

基于java的SpringBoot/SSM+Vue+uniapp的面向旅游的美食管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/4/18 5:39:28

计算机Java毕设实战-基于javaweb+mysql的校园招聘平台招聘管理系统基于springboot的启梦校园招聘平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 10:56:55

论文重复率不合格?5个科学方法,轻松降到目标值

论文重复率超30%&#xff1f;5个降重技巧&#xff0c;一次降到合格线 嘿&#xff0c;大家好&#xff01;我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题&#xff1a;论文重复率飙到30%以上怎么办&#xff1f;别慌&#xff0c;我这就分享5个实用降重技巧&#xff0c;帮你一次…

作者头像 李华
网站建设 2026/4/18 6:52:02

2025最新!10个AI论文平台测评:继续教育写作难题全解决

2025最新&#xff01;10个AI论文平台测评&#xff1a;继续教育写作难题全解决 2025年AI论文平台测评&#xff1a;精准解决继续教育写作难题 在继续教育领域&#xff0c;撰写高质量论文已成为许多学员和从业者的必修课。然而&#xff0c;面对时间紧张、资料查找困难、格式不规范…

作者头像 李华
网站建设 2026/4/17 3:42:28

RestCloud ETL 4.0 Docker 部署指南

RestCloud ETL 4.0 Docker 部署指南 现状 截至当前日期官网的4.0的windows全能包无法正常下载&#xff0c;点击无反应。 采用Docker安装。 操作前准备 腾讯云账号注册windows专业版 或者 windows企业版已经可以访问的mongoDB服务 操作步骤 1. 启用 windows 自带的&#xff0c;h…

作者头像 李华
网站建设 2026/4/10 18:31:11

计算机Java毕设实战-基于Java+SpringBoot的星海书店管理系统的设计与实现基于Java的书店管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华