文章

14

粉丝

230

获赞

26

访问

70.3k

头像
只区分空节点与非空结点 解决对称问题
P1551 东北大学机试题
发布于2022年8月7日 10:32
阅读数 5.2k

思路:

  1. 将非空结点的值修改成相同的值(如t),这样树的结点要么为#,要么为t;
  2. 逐层判断(1----2----4-----8)每层的字符数按照这样的规律提取子串,子串倒转之后,内容不变,即对称;

带注释代码

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string str;
    cin>>str;
    int flag=0;
    int len = str.length();

    for(int i=0; i<len; i++) //将非空结点全部转换为t,只区分空节点和非空结点(注:这个方法借鉴学习了csYfZhang的题解)
        if(str[i]!='#')
            str[i]='t';

    int index=0,t=1;
    string temp1,temp2;
    while(index+t<=len)
    {
        temp1=str.substr(index,t);//提取该层的字符串
        temp2=temp1;
        reverse(temp1.begin(),temp1.end());//倒转比较
        if(temp1!=temp2)  //不等,说明不对称
        {
            flag=1;
            break;
        }
        index+=t;     //更新index  t的值
        t=t*2;
    }

    if(flag==1)  puts("NO");
    else puts("YES");

}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发