昨晚弄简历结果一不小心睡晚了,导致今天一整天都及其堕落,北京瘫了一天,但是作为一个有原则的人,觉得无论如何都得做起码一道题,结果又过了0点,也就只做了1道题。。。(′д` )…彡…彡
已知一个字符串,求该字符串中有多少组回文子串(每个字符本身就是一个回文子串)
思路:这道题效率最低的做法是人都知道——两层大循环逐一比较,所以在测试一组超长的字符串时超时了( ╯□╰ )
答案中的聪明人们表示一层大循环加一层小循环就够了。这里一个重要的关键点就是:回文字符串本身是对称的,所以从两头同时向回文字符串中心点缩小得到的子串也必然是回文字符串。
所以在每趟比较中设置一个中心点center,然后设置center的左left和右right标志位依次向字符串两头比较。
int CountPalindromicSubString(string s)
{
if(s == null)
{
return 0;
}
int result = s.Length;
//从0.5开始记且步长为0.5是因为当回文字符串长度为偶数和奇数的时候中心点的下标为不存在和存在两种情况,偶数个时就是挨着的两个数开始向左右检查,奇数个时就是中心点左右的两个数开始向左右检查
for(float center = 0.5f; center < s.Length; center += 0.5f)
{
int left = (int)(center - 0.5f);
int right = (int)(center + 1f);
while(left >= 0 && right < s.Length && s[left] == s[right])
{
result++;
left--;
right++;
}
}
return result;
}