演算法專題訓練(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演算法--O(n)迴文子串演算法
詳細瞭解請看以下連結: 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) 空間複雜度解決此題? 一個最暴力的做法,遍歷一
LeetCode(9)—— 迴文數
描述 判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例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.
leetcode(1)迴文數的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周專案6(2)-迴文、素數
/* *Copyright (c) 2014 ,煙臺大學計算機學院 *All right reserved. *檔名稱:迴文、素數.cpp *作 者:王偉誠 *完成日期:2014年11月11日 *版 本 號:1.0 * *問題描述:迴文