zoukankan      html  css  js  c++  java
  • LeetCode-5-最长回文子串

    LeetCode-5-最长回文子串

    题目

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

    示例 1:
    
    输入: "babad"
    输出: "bab"
    注意: "aba" 也是一个有效答案。
    
    示例 2:
    
    输入: "cbbd"
    输出: "bb"
    

    题目

    这道题也是以前完成的,大概思路是这样的:

    假如字符串s中,从i到j的字串是回文串,那么从i+1到j-1肯定也是回文串;

    反过来想,如果一个字符肯定是回文串,然后从这个字符出发往两端延伸,两端相同则是回文串;

    于是有以下思路:

    首先设定一个函数func,给定一个开始i和结束j,然后递归自己,往两端延伸,直到不是回文串为止,返回长度;

    遍历数组,将每个字符输入func,获取最大回文串长度,如果当前字符和下一个字符相同,也带入func;

    最后返回最大回文串长度对应的子串;

    思路比较凌乱,以后整理一个动态规划版本的,重新写一遍;

    代码

    #include <stdio.h>
    #include <string.h>
    
    int func(int i, int j, char *s)
    {
    	int len = strlen(s);
    	
    	// 超出边界判断 
    	if (i-1 < 0 || j+1 == len)
    		return (j-i+1);
    	
    	// 不相等判断 
    	if (s[i-1] != s[j+1])
    		return (j-i+1);
    	else
    		return func(i-1, j+1, s);	
    }
    
    
    char * longestPalindrome(char * s){
    	int begin = -1, max = -1;
        int len = strlen(s);
        int half = 0, tmp = 0;
        int i = 0;
        
        if (len == 0 || len == 1)
        	return s;
        
        for (i=0; i<len-1; i++)
        {
    		tmp = func(i, i, s);
    		if(tmp > max)
    		{
    			half = tmp / 2;
    			max = tmp;
    			begin = i - half;
    		}
    		if (s[i] == s[i+1])
    		{
    			tmp = func(i, i+1, s);
    			if (tmp > max)
    			{
    				half = tmp / 2;
    				max = tmp;
    				begin = i - half + 1;
    			}
    		}
        }
        // 截断字符串 
        s[begin+max] = '';
        
        return (s+begin);
    }
    
  • 相关阅读:
    电机驱动MCU通用功能和技术点解析
    串行SPI NOR闪存VS并行NOR闪存
    非易失性存储器Flash和EEPROM之间的差异与优缺点
    为何要使用MCU
    MRAM实现对车载MCU中嵌入式存储器的取代
    ​弥补现有MRAM的不足
    将赛普拉斯nvSRAM替换为MRAM
    PSRAM在数据缓冲应用中可以取代SRAM或SDRAM
    数据库建表语句备份(二)
    数据库建表语句备份(一)
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/13066809.html
Copyright © 2011-2022 走看看