<20469>nice串 思路分享

重要的事情说三遍

!!!该答案并非最简题解!!!

!!!该答案并非最简题解!!!

!!!该答案并非最简题解!!!

今天模考订正时 无意间翻到了这道<20469>nice串

题目不难 但我的思路蛮有意思的 分享给大家

时间复杂度大致如上

dfs内4个参数

int x,double len,char y,int cnt;

分别表示字符串的起始位置,长度,需要判断的小写字母,和当前的修改次数

依题意得 当字符串的起始位置为x 长度为len时

可能到达的位置为

now_x=x+len*dx[i]

其中

dx[]={-1,1,-0.5,1.5};

如下图

y*y*x&&&
x&&&y*y*

(x表示当前位置,&表示已遍历位置,*表示未遍历位置,y表示可能到达的位置)

判断越界和已访问的情况

if(now_x>=n||now_x<0||vis[now_x]==1) continue;   

进入深一层的dfs

dfs(now_x,len/2,char(y+1),cnt);

将now_x到now_x+len/2-1 将vis数组还原为0

在dfs的开头先判断此时的len是否等于0.5

如果等于就判断str[x ]的值

ans=min(ans,cnt)

然后return

如果不等于 就判断x到x+len-1的字符是否等于y

同时将cnt++ 将vis数组置1

在主函数中需分两种情况搜索

dfs(0,n/2,'a',0);   
dfs(n/2,n/2,'a',0);

分别表示起始位置为 0 和 len/2 的2种情况

具体代码就靠大家了

<听懂掌声> :clap: :clap: :clap:

图片内容来源于网络

4 个赞

巨佬小弟膜拜膜拜膜拜你 :laughing:

%%%(被楼主强制评论)

还是很不错的 :upside_down_face: