列表

详情


NC353. 回文子串的数量

描述

给定一个长度为 n 的字符串,请你统计并返回这个字符串中回文子串的数目。

回文子串:字符串中连续字符组成的一个子串,这个子串正着读和倒着读一样。
只要开始位置和结束位置不同,相同字符组成的子串也视为不同的回文子串。

数据范围:字符串的长度满足 ,字符串中仅出现小写英文字母

示例1

输入:

"nowcoder"

输出:

8

示例2

输入:

"nnn"

输出:

6

说明:

六个回文子字符串分别是 n , n , n , nn , nn , nnn

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-08-01

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return int整型
     */
    int ans=0;
    int Substrings(string str) {
        // write code here
        int N=str.size();
        for(int i=0;i<N;i++)
        {
            Isplm(str,i,i);
            Isplm(str,i,i+1);
        }
        return ans;
    }
    void Isplm(const string&str,int left,int right)
    {
         int N=str.size();
         while(left>=0&&right<N)
         {
             if(str[left]!=str[right])
             {
                break;
             }
             ans++;
             left--;
             right++;
         }
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 424KB, 提交时间: 2022-05-19

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return int整型
     */
    int Substrings(string str) {
        // write code here
        int cnt = 0, n= str.length();
    for (int i = 0; i < 2*n-1; i++) {
        int left = i / 2, right = i / 2 + i % 2;
        while (left >= 0 && right < n && str[left] == str[right]) {
            left--;
            right++;
            cnt++;
        }
    }
    return cnt;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 424KB, 提交时间: 2022-04-17

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return int整型
     */
    int Substrings(string str) {
        // write code here
        int N = str.size(), ans = 0;
        for(int i=0; i<N; i++){
            for(int j=0; i+j>=0 and i+j<N; j++){
                int st = i-j, ed = i+j;
                if(str[st]!=str[ed]) break;
                ans++;
            }
            for(int j=0; i+j>=0 and i+j+1<N; j++){
                int st = i-j, ed = i+j+1;
                if(str[st]!=str[ed]) break;
                ans++;
            }
        }
        return ans;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 436KB, 提交时间: 2022-06-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return int整型
     */
    int Substrings(string str) {
        // write code here
        int n = str.length();
		if (n <= 1)
			return n;
		int maxlen = 1;
		int left = 0, right = 0;
		int temp = -1;
		int result = n;
		for (int i = 0; i < n; i++)
		{

			left = i - 1;
			right = i + 1;
			temp = 1;
			if (left >= 0 && right < n && str[left] == str[right])
			{
				while (1)
				{
					if (left < 0 || right >= n || str[left] != str[right])
					{
						left++;
						right--;
						break;
					}
					left--;
					right++;
                    result++;
				}
			}

			left = i;
			right = i + 1;
			if (left >= 0 && right < n && str[left] == str[right])
			{
				while (1)
				{
					if (left < 0 || right >= n || str[left] != str[right])
					{
						left++;
						right--;
						break;
					}
					left--;
					right++;
                    result++;
				}
			}
		}
		return result;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 504KB, 提交时间: 2022-04-19

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return int整型
     */
    int extend(const string& s,int i,int j,int size){
        int res=0;
        while(i>=0&&j<size&&s[i]==s[j]){
            i--;
            j++;
            res++;
        }
        return res;
    }
    int Substrings(string s) {
        // write code here
        int res=0;
        for(int i=0;i<s.size();i++){
            res+=extend(s,i,i,s.size());
            res+=extend(s,i,i+1,s.size());
        }
        return res;
    }
};

上一题