锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#Runtime: 97 ms (Beats 50%)
#Memory: 53.4 MB (Beats 8.49%)
class Solution(object):
def maxLength(self, arr):
"""
:type arr: List[str]
:rtype: int
"""
candidate = []
for s in arr:
u = set(s)
if len(s) == len(u):
candidate.append(u)
ans = [set()]
maxx = 0
for i in candidate:
for j in ans:
if not i & j:
ans.append(i | j)
maxx = max(maxx, len(i | j))
return maxx
]]>
2 #Runtime: 175 ms (Beats 90.41%)
3 #Memory: 30 MB (Beats 6.85%)
4
5 class Solution(object):
6 def sortVowels(self, s):
7 """
8 :type s: str
9 :rtype: str
10 """
11 s, vols, pos = list(s), [], []
12 vol_set = set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'])
13 for i, ch in enumerate(s):
14 if ch in vol_set:
15 vols.append(ch)
16 pos.append(i)
17 vols.sort()
18 for i, ch in zip(pos, vols):
19 s[i] = ch
20 return ''.join(s)
]]>
2 #Runtime: 14 ms (Beats 91.96%)
3 #Memory: 14.2 MB (Beats 88.75%)
4
5 class Solution(object):
6 def reverseWords(self, s):
7 """
8 :type s: str
9 :rtype: str
10 """
11 return ' '.join(s.split( )[::-1])[::-1]
]]>
2 #Runtime: 17 ms (Beats 88.78%)
3 #Memory: 13.7 MB (Beats 55.12%)
4
5 class Solution(object):
6 def repeatedSubstringPattern(self, s):
7 """
8 :type s: str
9 :rtype: bool
10 """
11 return s in (s + s)[1:-1]
]]>
2 #Runtime: 135 ms (Beats 83.33%)
3 #Memory: 18.1 MB (Beats 6.94%)
4
5 class Solution(object):
6 def maxVowels(self, s, k):
7 """
8 :type s: str
9 :type k: int
10 :rtype: int
11 """
12 cnt = [0] * (len(s) + 1)
13 t, ans = 0, 0
14 for i, ch in enumerate(s):
15 if ch in 'aeiou':
16 t += 1
17 cnt[i + 1] = t
18 for i in range(k, len(cnt)):
19 ans = max(ans, cnt[i] - cnt[i - k])
20 return ans
]]>
2 #Runtime: 341 ms (Beats 65.91%)
3 #Memory: 13.9 MB (Beats 79.55%)
4
5 class Solution(object):
6 def numSimilarGroups(self, strs):
7 """
8 :type strs: List[str]
9 :rtype: int
10 """
11 fa = [i for i in range(len(strs))]
12 #rank = [0] * len(strs)
13 def find(x):
14 i = x
15 while x != fa[x]:
16 x = fa[x]
17 fa[i] = x
18 return x
19
20 def union(a, b):
21 fa[find(a)] = find(b)
22
23 def is_similar(x, y):
24 tp = 0
25 for i in range(len(x)):
26 if x[i] != y[i]:
27 tp += 1
28 if tp > 2:
29 return False
30 return True
31
32 n_group = len(strs)
33 for i in range(len(strs)):
34 for j in range(i + 1, len(strs)):
35 if find(i) != find(j) and is_similar(strs[i], strs[j]):
36 n_group -= 1
37 union(i, j)
38 return n_group
]]>
2 #Runtime: 398 ms (Beats 94.87%)
3 #Memory: 15 MB (Beats 94.87%)
4
5 class Solution(object):
6 def minInsertions(self, s):
7 """
8 :type s: str
9 :rtype: int
10 """
11 n = len(s)
12 dp = [[0] * n for _ in range(n)]
13 for i in range(n - 1, -1, -1):
14 dp[i][i] = 1
15 for j in range(i + 1, n):
16 if s[i] == s[j]:
17 dp[i][j] = dp[i + 1][j - 1] + 2
18 else:
19 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
20 return len(s) - dp[0][n-1]
]]>
2 #Runtime: 311 ms (Beats 87.74%)
3 #Memory: 16.5 MB (Beats 43.40%)
4
5 class Solution(object):
6 def removeStars(self, s):
7 """
8 :type s: str
9 :rtype: str
10 """
11 ss = []
12 for ch in s:
13 if ch == '*':
14 ss.pop()
15 else:
16 ss.append(ch)
17 return ''.join(ss)
]]>
鍐欎簡涓畝鍗曠矖鏆寸殑錛屽厛鎵懼嚭needle棣栧瓧姣嶅湪haystack鎵鏈夊嚭鐜頒綅緗紝鍐嶇湅鏄惁鍖歸厤
2 #Runtime: 11 ms (Beats 95.49%)
3 #Memory: 13.2 MB (Beats 98.73%)
4
5 class Solution(object):
6 def strStr(self, haystack, needle):
7 """
8 :type haystack: str
9 :type needle: str
10 :rtype: int
11 """
12 if len(needle) == 0:
13 return 0
14 occur_lst = [i for (i, ch) in enumerate(haystack) if needle[0]]
15 for i in occur_lst:
16 if haystack[i : i + len(needle)] == needle:
17 return i
18 return -1
]]>
2 #Runtime: 513 ms (Beats 66.67%)
3 #Memory: 33.1 MB (Beats 50%)
4
5 class Solution(object):
6 def distinctNames(self, ideas):
7 """
8 :type ideas: List[str]
9 :rtype: int
10 """
11 suf = [set() for _ in range(26)]
12 for c in ideas:
13 suf[ord(c[0]) - ord('a')].add(c[1:])
14 ans = 0
15 for i in range(25):
16 for j in range(i + 1, 26):
17 cnt = len(suf[i] & suf[j])
18 ans += 2 * (len(suf[i]) - cnt) * (len(suf[j]) - cnt)
19 return ans
]]>
2 #Runtime: 371 ms (Beats 12.21%)
3 #Memory: 14.6 MB (Beats 29.63%)
4
5 class Solution(object):
6 def findAnagrams(self, s, p):
7 """
8 :type s: str
9 :type p: str
10 :rtype: List[int]
11 """
12 cnt_p = Counter(p)
13 l = len(p)
14 ans = []
15 for i in range(len(s)):
16 if s[i] in cnt_p:
17 cnt_p[s[i]] -= 1
18 if i >= l and s[i-l] in cnt_p:
19 cnt_p[s[i-l]] += 1
20 if all([cnt_p[j] == 0 for j in cnt_p]):
21 ans.append(i - l + 1)
22 return ans
]]>
2 #Runtime: 299 ms (Beats 32.65%)
3 #Memory: 14 MB(Beats 23.38%)
4
5 class Solution(object):
6 def checkInclusion(self, s1, s2):
7 """
8 :type s1: str
9 :type s2: str
10 :rtype: bool
11 """
12 cnt_s1 = Counter(s1)
13 l1 = len(s1)
14 for i in range(len(s2)):
15 if s2[i] in cnt_s1:
16 cnt_s1[s2[i]] -= 1
17 if i >= l1 and s2[i-l1] in cnt_s1:
18 cnt_s1[s2[i-l1]] += 1
19 if all([cnt_s1[i] == 0 for i in cnt_s1]):
20 return True
21 return False
]]>
2 #Runtime: 18 ms (Beats 91.10%)
3 #Memory: 13.4 MB (Beats 76.87%)
4
5 class Solution(object):
6 def isAlienSorted(self, words, order):
7 """
8 :type words: List[str]
9 :type order: str
10 :rtype: bool
11 """
12 ori_id = dict()
13 a = "abcdefghijklmnopqrstuvwxyz"
14 for i in range(26):
15 ori_id[order[i]] = a[i]
16 for i in range(len(words)):
17 trans_s = []
18 for j in words[i]:
19 trans_s.append(ori_id[j])
20 trans_s = ''.join(trans_s)
21 if i == 0:
22 pre = trans_s
23 else:
24 if pre > trans_s:
25 return False
26 pre = trans_s
27 return True
]]>
2 #Runtime: 21 ms (Beats 73.53%)
3 #Memory: 13.6 MB (Beats 30.88%)
4
5 class Solution(object):
6 def gcdOfStrings(self, str1, str2):
7 """
8 :type str1: str
9 :type str2: str
10 :rtype: str
11 """
12 for s_len in range(1 + min(len(str1), len(str2)), 0, -1):
13 if len(str1) % s_len != 0 or len(str2) % s_len:
14 continue
15 ss1 = str1[0:s_len] * (len(str1) // s_len)
16 ss2 = str1[0:s_len] * (len(str2) // s_len)
17 if ss1 == str1 and ss2 == str2:
18 return str1[0:s_len]
19 return ""
]]>
DP錛屽浜庢瘡涓涓崟璇峸錛屽紑涓涓狣P list錛宭ist闀垮害涓簑鐨勯暱搴?1錛宒p[0]=1錛屼箣鍚庤嫢鐩村埌w鐨勭i浣嶅彲浠ョ敤鍗曡瘝琛ㄤ腑鐨勫叾浠栧崟璇嶇粍鎴愶紝鍒檇p[i]=1錛岃嫢dp[len(w)]=1錛屽垯杈撳嚭璇ュ崟璇?br />鍏堝皢list杞負set錛屽姞閫熷悗緇煡鎵懼崟璇嶇殑閫熷害
澶嶆潅搴(n*L*L)錛岃繍琛屾晥鐜囧ソ鍍忎竴鑸?br />
2 #Runtime: 1236 ms (Beats 20%)
3 #Memory: 16.6 MB (Beats 88.57%)
4
5 class Solution(object):
6 def findAllConcatenatedWordsInADict(self, words):
7 """
8 :type words: List[str]
9 :rtype: List[str]
10 """
11 word_dict = set(words)
12 ans = []
13 for w in words:
14 dp = [0] * (len(w) + 1)
15 dp[0] = 1
16 for i in range(len(w)):
17 if not dp[i]:
18 continue
19 for j in range(i + 1, len(w) + 1):
20 if j - i < len(w) and w[i:j] in word_dict:
21 dp[j] = 1
22 if dp[len(w)]:
23 ans.append(w)
24 break
25 return ans
]]>
鏂規硶涓錛氬厛DFS錛屼笉鏂蛋宸﹀瓙鏍戠殑璺緞錛岀畻鍑轟簩鍙夋爲灞傛暟max_depth錛岄偅涔堟渶鍚庝竴灞傝妭鐐圭殑鏁伴噺涓篬1, 2^(max_depth-1)]錛岀洿鎺ヤ簩鍒嗚繖涓寖鍥達紝鐒跺悗綆楀嚭鏈鍚庝竴涓彾瀛愮粨鐐硅惤鍦ㄥ摢閲岋紝鐞嗚澶嶆潅搴(logn)*O(logn)
2 #Runtime: 156 ms
3 #Memory Usage: 29.2 MB
4
5 # Definition for a binary tree node.
6 # class TreeNode(object):
7 # def __init__(self, val=0, left=None, right=None):
8 # self.val = val
9 # self.left = left
10 # self.right = right
11 class Solution(object):
12 def binarySearch(self, root, depth, mid, l, r):
13 if depth == self.max_depth - 1:
14 if root:
15 return True
16 return False
17 if mid <= (l + r)//2:
18 return self.binarySearch(root.left, depth + 1, mid, l, (l + r)//2)
19 else:
20 return self.binarySearch(root.right, depth + 1, mid, (l + r)//2, r)
21
22 def countNodes(self, root):
23 """
24 :type root: TreeNode
25 :rtype: int
26 """
27 self.max_depth = 0
28 rt = root
29 while rt:
30 rt = rt.left
31 self.max_depth = self.max_depth + 1
32 if not self.max_depth:
33 return 0
34 l = 1
35 r = 2**(self.max_depth - 1)
36 while l < r:
37 mid = (l + r) // 2 + (l + r) % 2
38 if self.binarySearch(root, 0, mid, 1, 2**(self.max_depth - 1)):
39 l = mid
40 else:
41 r = mid - 1
42 return l + 2**(self.max_depth - 1) - 1
鏂規硶浜岋細鐩存帴涓嶆柇浜屽垎鍦伴掑綊鎵懼乏鍙沖瓙鏍戯紝鐩村埌閬囧埌鏌愪釜婊′簩鍙夋爲鑺傜偣錛岀劧鍚巗um(宸﹀瓙鏍戠殑鎼滅儲緇撴灉)+sum(鍙沖瓙鏍戠殑鎼滅儲緇撴灉)+1錛堟牴緇撶偣錛夛紝鐞嗚澶嶆潅搴(logn)*O(logn)
2 #Runtime: 137 ms
3 #Memory Usage: 29.2 MB
4
5 # Definition for a binary tree node.
6 # class TreeNode(object):
7 # def __init__(self, val=0, left=None, right=None):
8 # self.val = val
9 # self.left = left
10 # self.right = right
11 class Solution(object):
12 def DFS(self, root, fg):
13 if not root:
14 return 1
15 if fg == 0:
16 return self.DFS(root.left, 0) + 1
17 return self.DFS(root.right, 1) + 1
18
19 def countNodes(self, root):
20 """
21 :type root: TreeNode
22 :rtype: int
23 """
24 if not root:
25 return 0
26 depth_l = self.DFS(root.left, 0)
27 depth_r = self.DFS(root.right, 1)
28 if depth_l == depth_r:
29 return 2**depth_l - 1
30 return self.countNodes(root.left) + self.countNodes(root.right) + 1
鏂規硶涓夛細鐩存帴DFS鏁存5鏍戞眰鑺傜偣鏁伴噺錛屽鏉傚害O(n)錛屾病鎯沖埌榪欎釜鏂規硶鍙嶈屾渶蹇?..
2 #Runtime: 87 ms
3 #Memory Usage: 29.4 MB
4
5 # Definition for a binary tree node.
6 # class TreeNode(object):
7 # def __init__(self, val=0, left=None, right=None):
8 # self.val = val
9 # self.left = left
10 # self.right = right
11 class Solution(object):
12 def DFS(self, root):
13 if not root:
14 return
15 self.ans += 1
16 self.DFS(root.left)
17 self.DFS(root.right)
18
19 def countNodes(self, root):
20 """
21 :type root: TreeNode
22 :rtype: int
23 """
24 self.ans = 0
25 self.DFS(root)
26 return self.ans
]]>
鏂規硶涓錛氱敤Python鑷甫鐨勫瓧絎︿覆split()錛屽緢鏂逛究
2 #Runtime: 34 ms
3 #Memory Usage: 13.7 MB
4
5 class Solution(object):
6 def reverseWords(self, s):
7 """
8 :type s: str
9 :rtype: str
10 """
11
12 return ' '.join(s.split()[::-1])
鏂規硶浜岋細鎵嬪伐鍒囧壊瀛楃涓?br />
2 #Runtime: 49 ms
3 #Memory Usage: 13.6 MB
4
5 class Solution(object):
6 def reverseWords(self, s):
7 """
8 :type s: str
9 :rtype: str
10 """
11 ans = []
12 tp = ""
13 for i in s:
14 if i == ' ':
15 if len(tp) > 0:
16 ans.append(tp)
17 tp = ""
18 else:
19 tp += i
20 if len(tp) > 0:
21 ans.append(tp)
22 tp = " "
23 return ' '.join(ans[i] for i in range(len(ans) - 1, -1, -1))
]]>
鑻=1錛孫(n^2)錛屾ā鎷熸瘡嬈℃尓涓浣嶅幓鏈熬鐒跺悗姹傛渶灝忓彲鑳?br />鑻>2錛屽垯鐞嗚涓婂彲浠ュ疄鐜頒換鎰忎氦鎹㈠厓绱犱綅緗紝閭e彧瑕佹妸string杞負list鐩存帴sort杈撳嚭
2 #Runtime: 38 ms
3 #Memory Usage: 13.4 MB
4
5 class Solution(object):
6 def orderlyQueue(self, s, k):
7 """
8 :type s: str
9 :type k: int
10 :rtype: str
11 """
12 if k == 1:
13 t = s
14 for i in range(1, len(s)):
15 if t > s[i : ] + s[0 : i]:
16 t = s[i : ] + s[0 : i]
17 else:
18 t = ''.join(sorted(list(s)))
19 return t
]]>
2 #Runtime: 59 ms
3 #Memory Usage: 13.2 MB
4
5 class Solution(object):
6 def intToRoman(self, num):
7 """
8 :type num: int
9 :rtype: str
10 """
11 dict = {1 : 'I', 5 : 'V', 10 : 'X', 50 : 'L', 100 : 'C', 500 : 'D', 1000 : 'M'}
12 nt = 1
13 ans = []
14 while num > 0:
15 tp = num % 10
16 if tp == 4:
17 ans.append(dict[nt] + dict[5*nt])
18 elif tp == 9:
19 ans.append(dict[nt] + dict[10*nt])
20 elif tp < 4 and tp > 0:
21 ans.append(dict[nt] * tp)
22 elif tp >= 5:
23 ans.append(dict[5*nt] + dict[nt] * (tp - 5))
24 num = num // 10
25 nt = nt * 10
26 ans.reverse()
27 return ''.join(ans)
]]>
]]>
]]>
鍦℉DOJ涓婄粍闃熷仛鏉窞璧涚殑棰樼殑鏃跺欑籂緇撲簡鍗婂ぉ涔熸病榪囥傘傝禌鍚庡惉璇存濊礬灝辨槸KMP錛孌P錛屾垜鐘舵佽漿縐誨鐞嗘湁闂銆傘?br> 浠婂ぉ鍙堟悶浜嗕竴鏅氫笂錛岃鏁橺iroy澶х墰涔嬪悗鍙戠幇閿欒鍘熷洜鍦╯鐘舵佷笉鐢ㄥ鐞?br>鎬濊礬錛歞p杞Щ鏂圭▼寰堝ソ鎯籌紝dp[i][j]琛ㄧず宸茬粡鎸変簡i嬈★紝褰撳墠鐘舵佹槸j(S鐨勭j涓瓧姣?錛屾鐜囨槸澶氬皯
鍏蜂綋瀹炵幇榪囩▼瑙佷唬鐮佸強娉ㄩ噴
//Problem: HDOJ 3689
//Source: 2010 Hangzhou Regional On-Site J Infinite monkey theorem
//Solution: KMP+DP(like DFA)
//Status: Accepted
//Running Time: 15Ms
//Author: Uriel
//2010.10.29
#include<stdio.h>
#include<string.h>
double dp[1050][20],dd[20];
char st[30],ch[30];
double p[30];
int nxt[30],s;

void GetNext(char* str)
{
nxt[0]=-1;
int i=0,j=-1;
while(str[i])
{
if(j==-1 || str[i]==str[j])
{
i++; j++; nxt[i]=j;
}
else j=nxt[j];
}
}

int main()
{
int n,m;
int i,j,k;
while(scanf("%d %d",&n,&m),n|m)
{
for(i=0;i<n;i++)
{
scanf("%s",st);
ch[i]=st[0];
scanf("%lf",&p[i]);
}
scanf("%s",st);
for(i=0;i<=m;++i)
{
for(j=0;j<=s;++j)dp[i][j]=0.0;
}
s=strlen(st);
GetNext(st);
dp[0][0]=1.0;
for(i=1;i<=m;i++)
{ //鍏辨寜m嬈?/span>
for(j=0;j<s;j++)
{ //鏋氫婦褰撳墠鐘舵?涓嶇敤鑰冭檻j=s,鍥犱負榪欐椂宸茬粡婊¤凍瑕佹眰,涓嶇敤綆椾笅鍘?!
for(k=0;k<n;++k)
{ //鏋氫婦褰撳墠榪欐鎸夊摢涓敭
if(!j)
{ //濡傛灉褰撳墠鐘舵佹槸榪樻病鏈夋寜鍑烘紜覆鐨勫墠緙
if(ch[k]==st[0])dp[i][1]+=dp[i-1][0]*p[k]; //濡傛灉榪欐鎸夌殑鏄窛鐨勭涓涓瓧姣?鐘舵佷粠0鍙樹負1
else //鍚﹀垯0鐘舵佺殑姒傜巼绱姞
dp[i][0]+=dp[i-1][0]*p[k];
}
else if(ch[k]==st[j])
{ //濡傛灉褰撳墠鎸夊浜嗚涓插綋鍓嶇姸鎬佺殑鍚庝竴涓瓧姣?/span>
dp[i][j+1]+=dp[i-1][j]*p[k]; //鐘舵?1
}
else
{
int tp=j;
while(tp>-1 && ch[k]!=st[tp])tp=nxt[tp]; //鍒╃敤KMP鐨凬ext鍑芥暟褰撳墠鐘舵佽綆楁寜涓媖涔嬪悗鐨勭姸鎬?鑳藉尮閰嶇殑鍓嶇紑闀垮害)
if(tp==-1)dp[i][0]+=dp[i-1][j]*p[k]; //濡傛灉褰撳墠鍖歸厤澶辮觸,鐘舵佸彉涓?錛屼笖绱姞鐘舵?鐨勬鐜?/span>
else //鍚﹀垯鐘舵佷負tp+1,鐘舵乼p+1鐨勬鐜囩瘡鍔?/span>
dp[i][tp+1]+=dp[i-1][j]*p[k];
}
}
}
}
double ans=0.0;
for(i=1;i<=m;++i)ans+=dp[i][s];//鎵鏈夐暱搴﹁兘寰楀埌鐘舵乻鐨勬鐜囦箣鍜屽嵆涓烘墍姹?/span>
printf("%.2f%%\n",100*ans);
}
return 0;
}
榪欎箞澶ф按鐨勯鎼炰簡榪欎箞涔呫傘傝屼笖瀛楃涓插張鏄垜鐨勪換鍔°傘傛澂鍏楓傘?br> 涓嬪懆涓夊幓鎴愰兘錛?9h45min錛岀涓嬈″潗榪欎箞闀挎椂闂寸伀杞︺傘?br> 紲堢シDSW Chengdu Regional 濂借繍銆傘俁egional鏄姝ょ殑瀹濊吹銆傘備笉鐭ラ亾浠ュ悗榪樻湁娌℃湁鏈轟細銆傘?
]]>
]]>
/**//*Problem: 3461 User: Uriel
Memory: 1232K Time: 125MS
Language: C Result: Accepted*/ 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int kmpMatch(char* Src, char* Pattern);
int GetNextdest(char* Pattern, int next[]);
int Next[10001];
int main()

{
char source[1000001];
char dest[10001];
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
memset(dest,0x00,sizeof(dest));
memset(source,0x00,sizeof(source));
scanf("%s",dest);
scanf("%s",source);
GetNextdest(dest,Next);
printf("%d\n",kmpMatch(source, dest));
}
return 0;
}
int kmpMatch(char* Src, char* Pattern)

{
int i=0,j=0;
int s_len,p_len;
int sum=0;
s_len=strlen(Src);
p_len=strlen(Pattern);
flag: while(i<s_len && j<p_len)

{
if(j==-1||Src[i]==Pattern[j])
{
++i;
++j;
}
else
{
j=Next[j];
}
}
if (j==p_len && i<s_len)
{sum++;j=Next[j];goto flag;}
else if(j==p_len && i==s_len)
{sum++;return sum;}
else
return sum;
}
int GetNextdest(char* Pattern, int next[])

{
int i=1,j=0;
int p_len=strlen(Pattern);
next[0]=-1;
while(i<p_len)
{
if(Pattern[i]==Pattern[j]||j==-1)
{
++i;++j;
if(Pattern[i]!=Pattern[j])next[i]=j;
else
next[i]= next[j];
}
else
j=next[j];
}
return 0;
}
]]>
/**//*Problem: 2406 User: Uriel
Memory: 5100K Time: 141MS
Language: C Result: Accepted*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int GetNextVal(char* Pattern, long next[]);
long Next[1000001];
char dest[1000001];
int main()

{
long n,key;
while(scanf("%s",dest)!=EOF)
{
if(dest[0]=='.')exit(0);
n=strlen(dest);
GetNextVal(dest,Next);
key=n/(n-Next[n-1]);
if(n%(n-Next[n-1])==0)printf("%d\n",key);
else
printf("1\n");
memset(dest,0x00,sizeof(dest));
}
return 0;
}
int GetNextVal(char* Pattern, long next[])

{
long i=1,j=0;
long p_len=strlen(Pattern);
next[0]=0;
while(i<p_len)
{
if(Pattern[i]==Pattern[j])
{
next[i]=j+1;
i++;
j++;
}
else if(j>0)
{
j=next[j-1];
}
else
{
next[i]=0;
i++;
}
}
return 0;
}

]]>