1. 程式人生 > >Leetcode+牛客網—迴文串總結(一)

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型