Leetcode+牛客網—迴文串總結(一)
題目一:
大家對迴文串不陌生吧?一個字串從前看和從後看如果一樣的話,就是迴文串。比如“上海自來水來自海上”就是一個迴文串。現在我們的問題來了,把一個數字看成字串,問它是不是一個迴文數?這麼簡單的題目對想要成為小米工程師的你來說肯定不是問題。不過提醒一下哦:時間複雜度和空間複雜度越低的演算法,得分越高。
常規解法:
(1)大多數人想到的肯定是現將數字轉換為字串,然後首尾進行判斷比較,得出是否是迴文串。
程式碼如下:
public boolean isPalindromeNumber(long num){ String str = num + ""; int start = 0; int end = str.length() - 1; while(start <= end){ char s = str.charAt(start); char e = str.charAt(end); if(s != e){ return false; }else{ start++; end--; } } return true; }
高效解法:
本題在時間複雜度和空間複雜度上有所要求,所有采用將數字轉換成字串,在空間複雜度顯然有點不划算,通過計算得到數字前後對應位的數字,顯然要好一些(需要深厚的數學功底)
public static boolean isPalindromeNumber(long num){ int a = (int) num; int h = 1; // h要保持和剩餘的數字一樣的位數 if (a < 0) return false; while (a / h >= 10) { h = h * 10; } while (a > 0) { if (a / h != a % 10) // a/h可以得出首位數字; a%10則可以得出末位數字 return false; a = a % h; // 去除首位數字 a = a / 10; // 去除末位數字 h = h / 100; } return true; }
題目二:
對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。給定字串A以及它的長度n,請返回最長迴文子串的長度。
思路:
本題使用暴力破解法,時間複雜度為O(N的立方),我們先看一種使用動態規劃,使得時間複雜度降為了O(N的平方)的演算法。
動態規劃:分解成小問題,並且使用額外的輔助空間來完成最最優解的儲存。
public int getLongestPalindrome(String s, int n) { // write code here if(s==null||n<=0){ return 0; } // 字串長度為1,則其是迴文串 if(n==1){ return 1; } // 動態規劃中,用於儲存最長迴文串的值,比如pair[0][1]表示從0-1的迴文串長度,陣列值為0表示不是迴文串 int[][] pair = new int[n][n]; int max=0; // 需要維護的max變數 for(int i=0;i<n;i++){ for(int j=0;j<=i;j++){ // 從前往後計算是否需要更新pair陣列 // 當字元相等時,有兩種情況需要更新pair陣列: // (1)這兩個字元是挨著的,即i-j<2; // (2)這兩個字元中間的字串是迴文串,即pair[j+1][i-1]>0 if(s.charAt(i)==s.charAt(j)&&(i-j<2||pair[j+1][i-1]>0)){ pair[j][i]=i-j+1; // 判斷是否需要更新max變數 if(pair[j][i]>max){ max=pair[j][i]; } } } } return max; }
LeetCode原題:需要的不是最長的迴文串長度,而是讓你輸出最長的迴文串,則我們在更新max變數的時候,必須一併將其pair陣列的兩個下標儲存,最後根據start和end變數來擷取原字串,輸出最長迴文子串
public String longestPalindrome(String s) {
// write code here
int len = s.length();
if(s==null||len<=0){
return null;
}
if(len==1){
return s;
}
int[][] pair = new int[len][len];
int max = 0;
int start = 0;
int end = 0;
for(int i=0;i<len;i++){
for(int j=0;j<=i;j++){
if(s.charAt(i)==s.charAt(j)&&(i-j<2||pair[j+1][i-1]>0)){
pair[j][i]=i-j+1;
if(pair[j][i]>max){
max=pair[j][i];
start = j;
end = i;
}
}
}
}
return s.substring(start,end+1);
}
如果對你有幫助,記得點贊哦~歡迎大家關注我的部落格,可以進群366533258一起交流學習哦~
本群給大家提供一個學習交流的平臺,內設菜鳥Java管理員一枚、精通演算法的金牌講師一枚、一枚、藍芽BlueTooth管理員一枚、Web前端管理一枚以及C#管理一枚。歡迎大家進來交流技術。
相關推薦
Leetcode+牛客網—迴文串總結(一)
題目一: 大家對迴文串不陌生吧?一個字串從前看和從後看如果一樣的話,就是迴文串。比如“上海自來水來自海上”就是一個迴文串。現在我們的問題來了,把一個數字看成字串,問它是不是一個迴文數?這麼簡
牛客網刷題知識點總結(三)面向物件
三、面向物件 1.在繼承中,子類不會繼承父類的構造方法。。但是可以通過super呼叫 2.普通方法能夠呼叫靜態方法,不能呼叫靜態屬性。反過來,靜態方法只能呼叫靜態屬性,不能呼叫非靜態的方法和屬性。 3.父類沒有無參的建構函式,所以子類需要在自己的建構函式中顯式呼叫父類的建構
牛客網錯題集系列(一)
1.java基本型別的預設值和取值範圍 int 0 -2^31—-2^31-1 short 0 &
牛客網錯題集系列(四)
目錄 1.高優先順序的執行緒比低優先順序的執行緒執行得更快。() 2.下列哪些語句關於 java 記憶體回收的說明是正確的? 3.Java的跨平臺特性是指它的原始碼可以在多個平臺執行。 4.關於多執行緒 5. 假設 a&nb
牛客網錯題集系列(三)
目錄 1.關於Integer的一個問題 2.關於泛型的一道題 3.關於Integer型別超過128時的一道題 4.以下哪一個不是賦值符號? 5.關於try/catch/finally 6.關於for迴圈的執行順序問題 7.下面程式碼的輸出結果是什麼? 8.多執行緒
牛客網錯題集系列(二)
目錄 1.在開發中使用泛型取代非泛型的資料型別(比如用ArrayList取代ArrayList),程式的執行時效能會變得更好。() 2.關於異常丟擲 3.list是一個ArrayList的物件,哪個選項的程式碼填到//todo delete處,可以在Iterator遍歷的過程中正確並
文檔總結(一)——文檔的概述
理解 需要 軟件需求 是否 研究 strong 開發項目 問題 項目開發 寫完文檔後,本來想寫一篇具體的文檔的總結的,後來看大家都寫的具體文檔總結,於是我就想:我還是寫一些跟大家不一樣的東西吧。 所以,我就說說我對各個文檔的宏觀理解吧。
leetcode 求最長迴文串
題目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. 樣例
LeetCode---409. 最長迴文串
題目連結:https://leetcode-cn.com/problems/longest-palindrome/description/ 題目描述: 演算法描述: 分析下題目我們可以容易知道,只要某個字元的個數為偶數個的時候,那麼這些字元一定可以構成迴文數(因為題目沒
牛客網 迴環矩陣
連結:https://www.nowcoder.com/questionTerminal/205b62c2618546d6a52f23552b2699f6 來源:牛客網 首頁 > 試題廣場 > [問答題] 程式設計輸出以下格式的資料。 when i=1:
【LeetCode】125. 驗證迴文串
題目連結:https://leetcode-cn.com/problems/valid-palindrome/description/ 題目描述 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。 說明:本題中,我們將空字串定義為有效的迴文串。
【LeetCode】125. 驗證迴文串(Valid Palindrome)
【 英文練習 | 中文練習 】 題目描述: 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,忽略字母的大小寫。 解題思路: 用雙指標的思想,從字串的頭部與尾部向中間移動比較。 public boolean isPalindrome(String s) { if
【LeetCode】 125 驗證迴文串
解題思路: 1 哦 看吶,這是我們的老朋友雙指標,3Sum這道題也是用這個來做的。設定兩個指標從前後分別向中間遍歷,驗證遇到的對應位置的字元是不是相等。 2 需要注意:統一大小寫的時候別用Character的API toUpperCase,耗時較多,直接x-=32即可;同時注意不
leetcode 409. 最長迴文串
給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示
LeetCode 409. 最長迴文串(C、C++、python)
給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。 在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個迴文字串。 注意: 假設字串的長度不會超過 1010。 示例 1: 輸入: "abccccdd" 輸出: 7 解釋:
java 迴文串總結
package work3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class huiwenchuan2 {
【LeetCode】#125驗證迴文串(Valid Palindrome)
【LeetCode】#125驗證迴文串(Valid Palindrome) 題目描述 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。 說明:本題中,我們將空字串定義為有效的迴文串。 示例 示例 1: 輸入: “A man, a plan,
[LeetCode] Palindrome Partitioning 拆分迴文串
Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s. For example
Leetcode 214.最短迴文串
最短迴文串 給定一個字串 s,你可以通過在字串前面新增字元將其轉換為迴文串。找到並返回可以用這種方式轉換的最短迴文串。 示例 1: 輸入: "aacecaaa" 輸出: "aaacecaaa" 示例 2: 輸入: "abcd" 輸出: "dcbabcd"
牛客網C++題目總結(一)
準備從今天開始好好在牛客網上練習一些題提高程式碼能力,最近不知道在幹些什麼,所以想現在開始寫總結。一、函式指標的定義:C++指向函式的指標定義方式為:返回型別 (*指標名) (函式引數列表) ,例如 void (*p)(int)是指向一個返回值為void 引數為int型