「LeetCode」:String
LeetCode String 专题记录。
9月毕。
「我祝福你有时有坏运气,你会意识到概率和运气在人生中扮演的角色,并理解你的成功并不完全是你应得的,其他人的失败也并不完全是他们应得的。」
「不想要刚好错过的悔恨,那就要有完全碾压的实力。」
String
28-Implement strStr()
Problem:
返回第一个字串出现的下标
Solution:
Python就暴力匹配。
1 | class Solution: |
14-Longest Common Prefix
Problem:
返回串的公共最长前缀。
Solution:
暴力匹配长度就好。
1 | from typing import List |
58-Length of Last Word
Problem:
单词串由字母和空格组成,返回最后一个单词的长度。
Solution:
注意串最后的空格。
1 | class Solution: |
58-First Unique Character in a String
Problem:
找第一个没有重复出现的字符下标。
Solution:
暴力。
1 | class Solution: |
寻找子串开始索引:
- str.find(substr, beg=0, end=len(string))
- substr: 字串
- beg: 开始索引
- end: 结束索引,默认字符串长度。
- 如果字符串不包含子串,则返回
-1
- str.index(str, beg=0, end=len(string))
- 和find差不多,如果不包含子串会抛出异常。
383-Ransom Note
Problem:
给两个字符串,判断串1的字符能否由串2的字符组成。
Solution:
字典计数。
1 | class Solution: |
- 初始化字典的值:
dic.setdefault(ch, 0)
344-Reverse String
Problem:
in-place 反转字符串 with O(1) 的额外空间。
Solution:
前后两个指针交换。
1 | from typing import List |
151-Reverse Words in a String
Problem:
反转字符串word by word.(结果中单词间只能有一个空格)
Solution:
把单词存入列表,再输出。
1 | class Solution: |
- 加号连接:
'a' + 'b'
- 逗号连接,只能用于print打印:
print(a, b)
- 直接连接:
print('a' 'b')
- 使用
%
格式化字符串:'%s %s' % ('hello', 'world')
format
格式化字符串:'{}{}'.format('hello', 'world')
join
内置方法:用字符来连接一个序列,数组或列表等:'-'.join(['aa', 'bb', 'cc'])
f-string
方法:aa, bb = 'hello', 'world'
,f'{aa} {bb}'
*
操作符:字符串乘法。
反转列表:[-1: : -1]
186-Reverse Words in a String II
186-Reverse Words in a String II
Problem:
反转单词in-places.
Solution:
两次反转,第一次整体反转,第二次再单词反转。
(不额外开个数组来逐个赋值AC不了,不知道为啥q w q)
1 | class Solution: |
Python 反转列表的方法:
list(reversed(a))
, reversed(a)返回的是迭代器,转换成list。a[::-1]
Python 字符串(str)和列表(list)互相转换:
str 转换为 list
list()
转换为单个字符列表str.split()
或者str.split(' ')
空格分割转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14str1 = "123"
list1 = list(str1)
print list1
# ['1', '2', '3']
str2 = "123 sjhid dhi"
list2 = str2.split() #or list2 = str2.split(" ")
print list2
# ['123', 'sjhid', 'dhi']
str3 = "www.google.com"
list3 = str3.split(".")
print list3
# ['www', 'google', 'com']list转换为str:
"".join(list)
无空格连接".".join(list)
345-Reverse Vowels of a String
345-Reverse Vowels of a String
Problem:
反转字符串中的元音字母。
Solution:
元音字母,包括大写元音字母和小写元音字母。
1 | class Solution: |
Python大小写转换:
- 所有字符转换为大写:
str.upper()
- 所有字符转换为小写:
str.lower()
- 第一个字母转换为大写字母,其余小写:
str.capitalize()
- 把每个单词的第一个字母转换为大写,其余小写。
1
2
3
4
5
6
7
8
9
10str = "www.runoob.com"
print(str.upper()) # 把所有字符中的小写字母转换成大写字母
print(str.lower()) # 把所有字符中的大写字母转换成小写字母
print(str.capitalize()) # 把第一个字母转化为大写字母,其余小写
print(str.title()) # 把每个单词的第一个字母转化为大写,其余小写
# WWW.RUNOOB.COM
# www.runoob.com
# Www.runoob.com
# Www.Runoob.Com- 所有字符转换为大写:
Python中string是不可变对象,不能通过下标的方式(如
str[0]='a'
)改变字符串。
205-Isomorphic Strings
Problem:
判断是否同构字符串。
Solution:
字符到字符的映射,必须是单射。
1 | class Solution: |
Python 集合的操作:
创建空集合:
set()
创建有初值的集合:
SET = {v0, v1, v2}
或者SET = set(v0)
判断元素是否在集合中:
x in SET
集合运算:
a-b
:属于a集合不属于b集合a|b
:属于a集合或属于b集合a&b
:集合a和集合b都包含的元素a^b
: 不同时包含于集合a和集合b的元素集合中添加元素:
s.add(x)
集合中添加元素,且参数可以是列表、元组、字典(是每个元素都添加进去)等:
s.update(x)
移除元素:
s.remove(x)
,如果元素不存在,则会发生错误。移除元素:
s.discard(x)
,如果元素不存在,不会发生错误。随机删除集合中的一个元素:
s.pop()
(原理:对集合无序排序,然后删除无序排列集合的第一个)计算集合元素的个数:
len(s)
清空集合
s.clear()
List Comprehension && Set Comprehension && Dictionary Comprehension
这个相当于数学中的 $S={2\cdot x\mid x\in \left[0,9\right)}$ 的表达。
List Comprehension
如果用数学中的这个表达来看下面的式子,就很显而易见了。
1
arr = [i for i in range(10)]
再看看加了其他限制的例子
1
2
3
4
5
6
7
8# filter the elements
arr1 = [x for x in arr if x % 2==0]
# add more conditions
arr2 = [x**2 for x in arr if x >= 3 and x % 2]
# use nested for loops
arr3 = [(x, y) for x in range(3) for y in range(4)]使用List Comprehension不仅优美,而且效率也会很高。
Set Comprehension
同样的
1
s = {x for x in range(100) if x%2 != 0 and x%3 != 0}
Dictionary Comprehension
Syntax:
{expression(variable): expression(variable) for variable, variable in input_set [predicate][, …]}
1
2
3
4
5
6
7
8
9
10
11
12
13
14# [(set_k), (set_v)]
for k, v in [(1, 2), (3, 4)]} {k: v
{1: 2, 3: 4}
for n in range(2)} {n: n
{0: 0, 1: 1}
chr(n): n for n in (65, 66, 66)} {
{'A': 65, 'B': 66}
# ((k1, v1), (k2, v2))
for k, v in (('I', 1), ('II', 2))} {k: v
{'I': 1, 'II': 2}
for k, v in (('a', 0), ('b', 1)) if v == 1} {k: v
{'b': 1}
68-Text Justification
Problem:
文本对齐,总结下来有以下几点要求。
- 如果不是最后一行,且该行不止一个单词,则要求左右对齐。
- 左右对齐:尽可能让单词间的空格均匀分布,如果不能均匀分布,则单词左边的空格应该比右边的空格多。
- 贪心的思想:应该尽可能的多放单词。
- 如果是最后一行,或者该行只有一个单词,则要求左对齐。
Solution:
分两种情况处理,判断是左对齐,还是右对齐。
左对齐:该行有x个单词
前x-1个单词的后面都应该只有一个空格。
最后一个单词后面就应该补齐所有空格。
左右对齐:该行有x个单词,有x-1个空格间隙。
计算得到该行的空格数w,则如果能均匀分配,则每个间隙应该有aver = w // (x-1) 个空格。
但也许不会均匀分配,因此,可能会多出m个空格(m < x-1 )
即前m个单词,单词的后面应该有(aver+1)个空格,后面的(x-1) - m个单词应该有aver个空格。
最后一个单词的后面没有空格。
1 | from typing import List |
Python的三元运算符:
#如果条件为真,返回真 否则返回假
condition_is_true if condition else condition_is_false1
2is_fat = True
state = "fat" if is_fat else "not fat"Python的整除是:
\\
,实数除是:\
Reference
- Python中字符串的连接方法总结: https://segmentfault.com/a/1190000015475309
「LeetCode」:String