LeetCode【5--最长的回文子串】 LeetCode【6--Z字形变换】
生活随笔
收集整理的這篇文章主要介紹了
LeetCode【5--最长的回文子串】 LeetCode【6--Z字形变换】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最長的回文子串
題目描述
給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
解題思路
可以跟無重復的最長子串一樣,用一個滑動窗口,只不過這個窗口的右邊界往右,左邊界每回要從右邊界的下標往左。
還需要一個二維數(shù)組記錄當前窗口中記錄的字符串是不是回文串
再需要一個變量記錄回文串的長度。比較出最大的回文串
例如:baccab
代碼實現(xiàn)
class Solution { public:string longestPalindrome(string s) {int n = s.size();//記錄字符串是否為回文字符串vector<vector<bool>> array (n,vector<bool>(n));string res = "";//記錄結果返回int length = 0; //記錄長度,比較出最長的回文子串if(n == 0)return s;if(n == 1)return s;//如果是兩個字符,則返回第一個字符res = s[0]; //外層循環(huán)右邊界for(int right = 0;right<n;++right){//內(nèi)層循環(huán)左邊界for(int left = right;left>=0;--left){//判斷是否為回文字串if(s[left] == s[right] //兩頭相等&& (right-left<=2 //長度小于等于3,并且兩頭相等比為回文串|| array[left+1][right-1]) //去掉兩頭,中間也是回文串才是回文串){//標記left~right該區(qū)間為回文串array[left][right] = true;if(right-left>length) //如果回文串長度大于之前記錄的長度,則記錄該串{res = s.substr(left,right-left+1);length = right-left; //記錄新長度} }}}return res;} };Z字形變換
題目描述
將一個給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串為 “LEETCODEISHIRING” 行數(shù)為 3 時,排列如下:
解題思路
一共四行numbers = 4
找規(guī)律,
step-2*1(行)-2*1(行)-step-2*1(行)-2*1(行)
step-2*2(行)-2*2(行)-step-2*2(行)-2*2(行)
第一行和和最后一行,為step = 2*numbers-2
中間是中間層的下標間距總是step-2*行數(shù),2*行數(shù)交替
代碼實現(xiàn)
class Solution { public:string convert(string s, int numRows) {if(numRows == 1) //如果只有一行數(shù)據(jù)直接返回return s;int step = numRows*2 - 2;string res = "";int index = 0; //記錄每行元素的下標int add = 0; //中間行間隔for(int i = 0; i<numRows;++i){index = i; //標記行數(shù)add = 2*i ; //出去第0行和numRows-1行中間行的間隔while(index<s.size()) //元素下標大于總個數(shù)要換行{res+=s[index];add = step - add ; //變換間隔,index += (i == 0 || i == numRows-1) ? step : add; //每行每個元素的下標都在變}}return res;} };總結
以上是生活随笔為你收集整理的LeetCode【5--最长的回文子串】 LeetCode【6--Z字形变换】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 紫檀也疯狂剧情介绍
- 下一篇: 成都大熊猫繁育基地最佳旅游时间