专栏文章

题解:UVA353 Pesky Palindromes

UVA353题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mind8c0o
此快照首次捕获于
2025/12/02 00:30
3 个月前
此快照最后确认于
2025/12/02 00:30
3 个月前
查看原文

题解:UVA353 Pesky Palindromes

题目传送门:


解题思路

让我们回顾一下题目吧~
这道题要求我们统计一个字符串中不同的回文子串的数量。回文子串是指从左到右和从右到左读都相同的子串。我们需要遍历字符串的所有可能子串,并判断其是否为回文,同时确保这些回文子串是唯一的。

主要思路:

  1. 枚举所有子串:我们需要遍历字符串的所有可能子串。对于一个长度为 nn 的字符串,子串的总数是 O(n2)O(n^2) 级别的。
  2. 判断回文:对于每个子串,我们检查它是否为回文。回文的判断方法是:从子串的两端向中间逐个字符比较,如果所有字符都相同,则该子串是回文。
  3. 去重:为了避免重复统计相同的回文子串,我们可以使用一个 set 来存储所有找到的回文子串,set 会自动去重。
  4. 输出结果:最后,我们输出 set 的大小,即为不同回文子串的数量。
人话:枚举串开头的 ii 与结尾的 jj ,然后看所构成的字符串是不是回文串,如果是,存入集合中,最后按题目的要求再输出。

AC Code:

// 抄题解的代码只能增加估值,不能提升自己,不要抄题解!一定要能理解
CPP
#include<iostream>
#include<set>
#include<string>
#define Luogu using
#define Article namespace
#define HuangRuibo std
Luogu Article HuangRuibo;
bool HUIWEN(const string& s)//不会英文的屑...
{
    int left=0,right=s.size()-1;//从i(left)到j(right)枚举 
    while(left<right)
	{
        if(s[left]!=s[right])
		{
            return false;
        }
        left++;//缩小范围 
        right--;//同上 
    }
    return true;
}

int main()
{
    string str;
    while(cin>>str)//while直到没有输入了 
	{
        set<string> huiwen;//屑 
        int n=str.size();
        
        for(int i=0;i<n;++i)
		{
            for(int j=i;j<n;++j)
			{
                string _substr_=str.substr(i,j-i+1);
                if(HUIWEN(_substr_))
				{
                    huiwen.insert(_substr_);
                }
            }
        }
        
        cout<<"The string '"<<str<<"' contains "<<huiwen.size()/*"huiwen"的大小*/<<" palindromes."<<endl;//按要求输出(小心别写错了awa)
    }
    return 0;//完结撒花!!
}

AC Record:

Luogu(洛谷上咋都UKE了?)

评论

1 条评论,欢迎与作者交流。

正在加载评论...