1. 程式人生 > >演算法專題訓練(3)迴文字串

演算法專題訓練(3)迴文字串

將s翻轉成s1 求s和s1的最長公共子序列長度
可以先判斷下s是否是迴文
另外一個思路
dp[i][j] = dp[i + 1][j - 1] + 2 if s[i] == s[j]
dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]) otherwise

class Solution(object):
    def longestPalindromeSubseq(self, s):
        """
        :type s: str
        :rtype: int
        """
size = len(s) s1 = s[::-1] if s1 == s: return size dp = [[0]*(size+1) for i in range(size+1)] for i in range(size): for j in range(size): if s[i]==s1[j]: dp[i+1][j+1] = dp[i][j]+1 else: dp[i+1
][j+1] = max(dp[i][j+1],dp[i+1][j]) return dp[size][size]

在每個字元的兩邊都插入一個特殊的符號’#’
定義 id 為已知的 {右邊界最大} 的迴文子串的中心,mx則為id+P[id],也就是這個子串的右邊界

class Solution(object):
    def longestPalindrome(self,s):
        '''
        :param s: str
        :return: str
        '''
        ss = '$'
;idx=0;mx=0 for i in s: ss = ss+'#'+i ss = ss+'#' P = [0 for i in range(len(ss))] for i in range(1,len(ss)): if P[idx]+idx<i: P[i] = 1 else: P[i] = min(P[2*idx-i],P[idx]+idx-i) #對稱點 while(i+P[i]<len(ss) and ss[i-P[i]]==ss[i+P[i]]): P[i] = P[i]+1 if idx + P[idx] < i + P[i]: idx = i if P[i]>P[mx]: mx = i a = ss[mx - (P[mx] - 1):mx + P[mx]] ret = '' for i in a: if i!='#': ret+=i return ret

判斷s[i:j+1]是否是迴文等價於判斷s[i+1:j] 和 s[i][j]的情況

class Solution(object):
    def countSubstrings(self, s):
        """
        :type s: str
        :rtype: int
        """
        if s=='': return 0
        size = len(s)
        dp = [[0 for i in range(size)] for j in range(size)]
        ret = 0
        for i in range(size):
            dp[i][i]=1
            for j in range(i):
                if s[i]==s[j]:
                    if dp[i-1][j+1] or j==i-1:
                        dp[i][j] = 1
            ret += sum(dp[i])
        return ret

相關推薦

演算法專題訓練3字串

將s翻轉成s1 求s和s1的最長公共子序列長度 可以先判斷下s是否是迴文 另外一個思路 dp[i][j] = dp[i + 1][j - 1] + 2

6-3 判斷字串 20 point(s)

6-3 判斷迴文字串 (20 point(s)) 本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。 函式介面定義: bool palindrome( char *s ); 函式palindrom

Manacher演算法--On子串演算法

詳細瞭解請看以下連結: Problem Description 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度. 迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,

6-3 判斷字串20 分

本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。函式介面定義:bool palindrome( char *s ); 函式palindrome判斷輸入字串char *s是否為迴文。若是則返回true,否則返回false。裁

IO流3刪除件或件夾

exce rgs println create dem 註意 項目 txt lean 刪除功能:public boolean delete() * * 註意: * A:如果你創建文件或者文件夾忘了寫盤符路徑,那麽,默認在項目路徑下。 * B:Java中的刪除不走回

領釦LeetCode連結串列 個人題解

請判斷一個連結串列是否為迴文連結串列。 示例 1: 輸入: 1->2 輸出: false 示例 2: 輸入: 1->2->2->1 輸出: true 進階:你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?   一個最暴力的做法,遍歷一

LeetCode9——

描述 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例1: 輸入: 121 輸出: true 示例2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。 因此它不

積跬步至千里——演算法強化訓練8卡特蘭數相關題目求解

在程式設計之美上又看到卡特蘭數的題目,所以就把這類題目做個總結。 至此,已經遇到過得卡特蘭數的題目有: 1、12個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種? 解答:12個高矮不同,則可以編號1 2 3 4 5 6 7

積跬步至千里——演算法強化訓練9重寫標準庫函式

面試常常會遇到重寫標準庫裡面的函式的題目,現將其做一個總結: 1、strstr() strstr() 函式搜尋一個字串在另一個字串中的第一次出現。找到所搜尋的字串,則該函式返回第一次匹配的字串的地址;如果未找到所搜尋的字串,則返回NULL char* mystrstr(ch

Mahout協同過濾演算法原始碼分析3--parallelALS

Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。接上篇,此篇分析parallelALS的initializeM函式和for迴圈(for迴圈裡面含有一個QR分解,此篇只分析到這裡為止)。parallelALS的原始碼對應為:org.

leetcode1數的js實現

一.題目: 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例 1: 輸入: 121 輸出: true 示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不

Leetcode

迴文數: 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 1. 轉成字串解題 class Solution: def isPalindrome(self, x): """ :type x: int

數學建模演算法 一 簡述3規劃模型-整數規劃

整數規劃 定義: 規劃中的變數(全部或部分)限制為整數,稱為整數規劃。若線上性模型中,變數限制為整數,則稱為整數線性規劃。 一類要求問題的解中的全部或一部分變數為整數的數學規劃。從約束條件的構成又可細分為線性,二次和非線性的整數

積跬步至千里——演算法強化訓練7大數問題

大數問題:當感覺用long或int已經不能滿足要求,需要考慮大數問題。大數問題將普通的數學運算,轉移到字串上的操作。大數操作有很多寫法,但是我習慣用以下這個模板,因為對加法 乘法 減法都是一個路子,便於記憶和理解。 大數乘法: string Multi(string st

【暑期基礎2】D HDU Palindromes _easy version水:字串

迴文字串的水題 #include <stdio.h> #include <ctype.h> #include <string.h> int main() {

演算法導論複習3 堆排序

堆排序與歸併排序具有相同的時間複雜度O(nlgn),但是在講堆排序之前,先要搞清楚堆排序使用的“二叉堆” 二叉堆是一個數組,可以被看成近似的完全二叉樹 特點: 1.樹上每一節點對應一個

校招季——程式設計題目73

73. 迴文數 題目: 1.測試一個數是不是迴文數。 2.逆轉一個數的二進位制表示。 解答: 對於問題1,方法1: 用itoa將這個數轉換成字串,再測試這個字串是不是迴文字串。 方法2: 用兩個mask從兩端提取數字再比較: int mask1 = /* 和x同位數,略

數學建模演算法 一 簡述3規劃模型-線性規劃

線性規劃的定義: 求一組變數的值,在滿足一組約束條件下,求得目標函式的最優解。 根據這個定義,就可以確定線性規劃模型的基本結構: (1)變數 變數又叫未知數,它是實際系統的未知因素,也是決策系統中的可控因素,一般稱為決策變數,常引用英文字母加下標來表示,

經典演算法100道3-繪製一個圓

// 求確定範圍的最大約數.cpp : Defines the entry point for the console application./*求出555555的約數中最大的三位數約數   演算法分析:  求三位數的最大約數,那麼可以把範圍限制在100-999之間,  使

第11周專案62-、素數

/* *Copyright (c) 2014 ,煙臺大學計算機學院 *All right reserved. *檔名稱:迴文、素數.cpp *作 者:王偉誠 *完成日期:2014年11月11日 *版 本 號:1.0 * *問題描述:迴文