Longest Palindromic Substring(最长回文子串)
2016-08-04 15:05
405 查看
5. Longest Palindromic Substring
Question
Editorial Solution
My Submissions
Total Accepted: 121867
Total Submissions: 515479
Difficulty: Medium
题目描述:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest
palindromic substring.
Subscribe to see which companies asked this question
Show Tags
Hide Similar Problems
(H) Shortest Palindrome (E)
Palindrome Permutation (H) Palindrome Pairs
Have you met this question in a real interview? No
Thanks for your feedback.
Discuss Pick
One
题目思路:
从头开始遍历字符串,该字符的前后两个字符相等,则继续比较前面与后面的字符串,直到比较出不相等或者是到达了字符串的边界,记录此长度,若是比当前的最大记录大则 替换最大值。
代码如下:package cn.edu.bupt;
/**
* Created by jiaochenchen on 2016/8/4.
*/
public class LongestPalindromicSubstring_5 {
public String longestPalindrome(String s) {
if(s==null||s.length()==0){return "";}
if(s.length()==1){return s;}
int len=s.length();
int maxlen=0;
int start=0;
int end=0;
for(int index=0;index<len;index++){
if(index<len&&((index-1)>=0&&index+1<len&&s.charAt(index-1)==s.charAt(index+1))||((index+1)<len&&s.charAt(index+1)==s.charAt(index))){
if(index-1>=0&&s.charAt(index-1)==s.charAt(index+1)){
int i=index-1;
int j=index+1;
int tempmaxlen=1;
while(i>=0&&j<len&&s.charAt(i)==s.charAt(j)){
tempmaxlen+=2;
if(tempmaxlen>maxlen){maxlen=tempmaxlen;start=i;end=j;}
j++;i--;
}
}
if(s.charAt(index)==s.charAt(index+1)){
int i=index;
int j=index+1;
int tempmaxlen=0;
while(i>=0&&j<len&&s.charAt(i)==s.charAt(j)){
tempmaxlen+=2;
if(tempmaxlen>maxlen){maxlen=tempmaxlen;start=i;end=j;}
j++;i--;
}
}
}
}
System.out.println(start);
System.out.println(end);
return s.substring(start,end+1);
}
别人的高级代码,比我的代码高端在了在处理重复元素上,直接越过重复的元素,而不是处理每一个与前面相同的元素,而且设置了j元素,守在最初的i位置上,代码十分优雅
<pre name="code" class="cpp">string longestPalindrome(string s) { if (s.empty()) return ""; if (s.size() == 1) return s; int min_start = 0, max_len = 1; for (int i = 0; i < s.size();) { if (s.size() - i <= max_len / 2) break; int j = i, k = i; while (k < s.size()-1 && s[k+1] == s[k]) ++k; // Skip duplicate characters. i = k+1; while (k < s.size()-1 && j > 0 && s[k + 1] == s[j - 1]) { ++k; --j; } // Expand. int new_len = k - j + 1; if (new_len > max_len) { min_start = j; max_len = new_len; } } return s.substr(min_start, max_len); }
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- Redis02 使用Redis数据库(String类型)全面解析
- PostgreSQL ERROR: invalid escape string 解决办法
- C#中Byte[]和String之间转换的方法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- 关于C++ string和c类型字符数组的对比
- C#中string和StingBuilder内存中的区别实例分析
- 详解C++中实现继承string类的MyString类的步骤
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法