题干:

一个字符串是非回文的,当且仅当,他只由前p个小写字母构成,而且他不包含长度大于等于2的回文子串。

给出长度为n的非回文串s。请找出字典序比s大的,而且字典序要最小的长度为n的非回文。

Input单组测试数据。 
第一行有两个整数n 和p (1≤n≤1000; 1≤p≤26)。 
第二行包含一个字符串s,它的长度是n。输入保证他是非回文的。Output输出字典序比s大的且字典序要最小的长度为n的非回文,如果不存在输出NO。Sample Input

样例输入1
3 3
cba
样例输入2
3 4
cba

Sample Output

样例输出1
NO
样例输出2
cbd

解题报告:

首先分析出非回文的标志语句,归纳推出是s[i] ! = s[i-1] && s[i] != s[i-2] ,然后用dfs搜索字典序增大的就可以了。

ac代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int len;
int n,p;
char s[1000+5],ss[1000+5];//s复制到ss,对s做修改
bool bk[1000+5];
bool ok() {if(s[0]==s[1]) return false;for(int i = 2; i<len; i++) {if(s[i]==s[i-1]||s[i]==s[i-2]) return false;}if(strcmp(ss,s)==0) return false;return true;
}
bool dfs(int step) {if(step>n) return false;if(step==n) {if(ok() ) {printf("%s\n",s);return true;}return false;}char i;bk[step]==1 ? i='a' : i = ss[step];bk[step]=1; for(; i<=96+p; i++) {if(step>=2) {if(i==s[step-1]||i==s[step-2]) continue; }else if(step==1) if(i==s[step-1]) continue;s[step]=i;//还是直接放在for下面也无所谓? if(dfs(step+1) ) return true;}return false;
}
int main()
{while(~scanf("%d%d",&n,&p)) {memset(s,0,sizeof(s));memset(ss,0,sizeof(ss));memset(bk,0,sizeof(bk));scanf("%s",s);strcpy(ss,s);len=strlen(s);if(!dfs(0) ) {printf("NO\n");}}return 0 ;
}

法2:(不用深搜)

#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1005;char str[MAXN];int main() {int n, p;scanf("%d%d%s", &n, &p, str + 1);for (int i = n; i >= 1; i--) {int x = str[i] - 'a';if (x < p - 1) {int y = -1;for (int j = x + 1; j < p; j++) {char c = 'a' + j;if (i > 1 && c == str[i - 1]) continue;if (i > 2 && c == str[i - 2]) continue; y = j;break;}if (y == -1) continue;str[i] = 'a' + y;//printf("%d : %c\n", i, 'a' + y);if (i == n) {puts(str + 1);return 0;}for (int j = i + 1; j <= n; j++) {for (int k = 0; k < p; k++) {char c = 'a' + k;if (j > 1 && c == str[j - 1]) continue;if (j > 2 && c == str[j - 2]) continue; str[j] = c;break;}}puts(str + 1);return 0;}}puts("NO");return 0;
}

总结:注意字典序搜索的时候,不能都从 ss[step] 开始,需要有一个bk标记数组,因为第一次用完之后还需要从'a'开始,而不是ss[step]

【51NOD - 1523】 非回文(dfs)相关推荐

  1. Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开

    6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...

  2. Libre OJ 「BalticOI 2013」非回文数 数位dp

    传送门 文章目录 题意: 思路: 题意: 问[l,r][l,r][l,r]内有多少个数是非回文数,即数字中不存在连续几个数为回文数. l,r≤1e18l,r\le1e18l,r≤1e18 思路: 这么 ...

  3. 【51nod 1154】 回文串划分

    有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b|b|a|a|b ...

  4. 回文数的JAVA程序

    2019独角兽企业重金招聘Python工程师标准>>> 这是包括字符的回文数 import java.util.Scanner; import javax.swing.JOption ...

  5. 【简便解法】1079 延迟的回文数 (20分)_31行代码AC

    立志用更少的代码做更高效的表达 PAT乙级最优解+分析汇总-->传送门 给定一个 k+1 位的正整数 N,写成 ak-a1a0的形式,其中对所有 i 有 0≤a​i<10 且 a​k ​​ ...

  6. 1079. 延迟的回文数 (20)

    给定一个 k+1 位的正整数 N,写成 ak...a1a0 的形式,其中对所有 i 有 0 <= ai < 10 且 ak > 0.N 被称为一个回文数,当且仅当对所有 i 有 ai ...

  7. LeetCode 267. 回文排列 II(回溯)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合. 如不能形成任何回文排列时,则返回一个空列表. 示例 1: 输入: ...

  8. 算法-两最长回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1:输入: "babad" 输出: "bab" 注意: &q ...

  9. 1112个人赛,最长回文串常见算法讨论

    ps.此贴大部分文字与代码来自网上,我只是取长补短整理了下 S="c a b a"  那么  S' = "a b a c", 这样的情况下 S和 S'的最长公共 ...

最新文章

  1. Qt中如何改变三角形图形项的包围盒
  2. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
  3. java之Scanner
  4. 开源WebGIS实施方案(一):开篇 [转]
  5. PostgreSQL 创建库时如何指定 Collate, Ctype
  6. 河南大学明德计划2020计算机学院,关于选拔2020级物理学“明德计划”实验班学生的通知...
  7. 无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解
  8. 信息学奥赛C++语言: 计算两个数的最小公倍数
  9. linux 卷标设置与管理
  10. VRTK之手柄事件监听以及重写StartUsing方法实现与物体的交互
  11. ajax请求会阻塞dom,Jquery ajax 同步阻塞引起的UI线程阻塞问题_jquery
  12. c++11 多线程编程(二)------ 线程类构造函数深入理解
  13. Linux 命令之 tar 备份与解压缩
  14. VisualSVN Server提交整个工程项目
  15. 计算机语言t和o,PLC编程语言/操作指令/使用步骤详解
  16. 如何下载微信公众号的音频文件
  17. oracle rman表空间传输,rman 实现在线传输表空间(=10g)
  18. 安装MikTex并成功编译中文PPT模板详细过程
  19. Java字符串:getBytes() 方法
  20. jquery 延迟执行

热门文章

  1. [Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]
  2. [小技巧][JAVA][转换]整型int与字符串String相互转换
  3. [剑指offer]面试题第[6]题[JAVA][旋转数组的最小数字][二分法]
  4. 求递归算法时间复杂度:递归树
  5. 计算机信息管理相关课题论文,计算机信息管理课题论文[].doc
  6. excel亮灯怎么设置_Excel表格技巧—怎么给表格设置密码
  7. WEBSHELL权限提升 菜菜
  8. python发钉钉消息_Python调用钉钉机器人推送消息
  9. java版本streamgobbler_java调用本地命令 Runtime class's exec() method
  10. export LD_LIBRARY_PATH 的使用