zoukankan      html  css  js  c++  java
  • 最大回文子串:动态规划

    思路:

    dp[i][j]表示s[i]到s[j]的子串是否为回文。
    如果s[i+1]到s[j-1]是回文串,那么再加上条件:s[i]==[j],则dp[i][j]为true。算法的时间复杂度依旧为O(N^2),但减少了重复计算的部分。
    状态转移方程:

    初始情况:
    dp[i][i]=1
    dp[i][i+1]=1 if str[i]==str[i+1]
    单个字符,相邻字符相同都是回文串。

    代码:

    int longestPalindrome(char* s, int len)
    {
    	if (s == NULL || len <= 0)
    		return 0;
    	if (len == 1)
    		return 1;
    	int longest = 1;
    	int start = 0;
    	vector<vector<bool>> dp(len,vector<bool>(len)); //外层和内层大小都是len
    	for (int i = 0; i < len; i++) //初始情况 两种
    	{
    		dp[i][i] = 1;
    		if (i < len - 1)
    		{
    			if (s[i] == s[i + 1])
    			{
    				dp[i][i + 1] = 1;
    				start = i;
    				longest = 2;
    			}
    
    		}
    	}
    	for (int l = 3; l <= len; l++) //子串长度   状态转移的时候长度不断变长.
    	{
    		for (int i = 0; i + l - 1< len; i++)//保证右边界不越界
    		{
    			int j = i + l - 1;   //子串右边界
    			if (dp[i + 1][j - 1] && s[i] == s[j])
    			{
                        dp[i][j] = 1;
    					start = i;
    					longest = l;
    			}
    			
    		}
    	}
    	return longest;
    }
    
  • 相关阅读:
    XML 编码
    XML CDATA
    XML 命名空间
    XML 解析器
    XML XMLHttpRequest 对象
    XML 和CSS
    XML 验证
    XML 属性
    XML 元素
    XML 语法规则
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12456210.html
Copyright © 2011-2022 走看看