Skip to content

Commit b2b8211

Browse files
committed
2.4 回文字符串 => 2.4 乱序字符串
1 parent a042929 commit b2b8211

File tree

3 files changed

+6
-6
lines changed

3 files changed

+6
-6
lines changed

2.算法分析/2.4.一个回文字符串检查的例子/README.md renamed to 2.算法分析/2.4.一个乱序字符串检查的例子/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
## 2.4.一个回文字符串检查的例子
1+
## 2.4.一个乱序字符串检查的例子
22

3-
显示不同量级的算法的一个很好的例子是字符串的回文检查。一个字符串是另一个字符串的回文。如果第二个字符串只是第一个的重新排列,例如,'heart' 和 'earth' 就是回文字符串。'python' 和 'typhon' 也是。为了简单起见,我们假设所讨论的两个字符串具有相等的长度,并且他们由 26 个小写字母集合组成。我们的目标是写一个布尔函数,它将两个字符串做参数并返回它们是不是回文。
3+
显示不同量级的算法的一个很好的例子是字符串的乱序检查。一个字符串是另一个字符串的乱序。如果第二个字符串只是第一个的重新排列,例如,'heart' 和 'earth' 就是乱序字符串。'python' 和 'typhon' 也是。为了简单起见,我们假设所讨论的两个字符串具有相等的长度,并且他们由 26 个小写字母集合组成。我们的目标是写一个布尔函数,它将两个字符串做参数并返回它们是不是回文。
44

55
### 2.4.1.解法1:检查
6-
我们对回文问题的第一个解法是检查第一个字符串是不是出现在第二个字符串中。如果可以检验到每一个字符,那两个字符串一定是回文。可以通过用 None 替换字符来完成检查。但是,由于 Python 字符串是不可变的,所以第一步是将第二个字符串转换为列表。第一个字符串中的每个字符可以通过检查在第二个列表中检查元素是否存在,如果存在,替换成 None。见 ActiveCode1
6+
我们对乱序问题的第一个解法是检查第一个字符串是不是出现在第二个字符串中。如果可以检验到每一个字符,那两个字符串一定是回文。可以通过用 None 替换字符来完成检查。但是,由于 Python 字符串是不可变的,所以第一步是将第二个字符串转换为列表。第一个字符串中的每个字符可以通过检查在第二个列表中检查元素是否存在,如果存在,替换成 None。见 ActiveCode1
77

88
````
99
def anagramSolution1(s1,s2):
@@ -70,13 +70,13 @@ print(anagramSolution2('abcde','edcba'))
7070

7171
### 2.4.3.解法3: 穷举法
7272

73-
解决这类问题的强力方法是穷举所有可能性。对于回文检测,我们可以生成 s1 的所有回文字符串列表,然后查看是不是有 s2。这种方法有一点困难。当 s1 生成所有可能的字符串时,第一个位置有 n 种可能,第二个位置有 n-1 种,第三个位置有 n-3 种,等等。总数为 n∗(n−1)∗(n−2)∗...∗3∗2∗1n∗(n−1)∗(n−2)∗...∗3∗2∗1, 即 n!。虽然一些字符串可能是重复的,程序也不可能提前知道这样,所以他仍然会生成 n! 个字符串。
73+
解决这类问题的强力方法是穷举所有可能性。对于回文检测,我们可以生成 s1 的所有乱序字符串列表,然后查看是不是有 s2。这种方法有一点困难。当 s1 生成所有可能的字符串时,第一个位置有 n 种可能,第二个位置有 n-1 种,第三个位置有 n-3 种,等等。总数为 n∗(n−1)∗(n−2)∗...∗3∗2∗1n∗(n−1)∗(n−2)∗...∗3∗2∗1, 即 n!。虽然一些字符串可能是重复的,程序也不可能提前知道这样,所以他仍然会生成 n! 个字符串。
7474

7575
事实证明,n! 比 n^2 增长还快,事实上,如果 s1 有 20个字符长,则将有 20! = 2,432,902,008,176,640,000 个字符串产生。如果我们每秒处理一种可能字符串,那么需要 77,146,816,596 年才能过完整个列表。所以这不是很好的解决方案。
7676

7777
### 2.4.4.解法4: 计数和比较
7878

79-
我们最终解决回文的方法是利用两个回文字符串具有相同的 a, b, c 等等的事实。我们首先计算的是每个字母出现的次数。由于有 26 个可能的字符,我们就用 一个长度为 26 的列表,每个可能的字符占一个位置。每次看到一个特定的字符,就增加该位置的计数器。最后如果两个列表的计数器一样,则字符串为回文字符串。见 ActiveCode 3
79+
我们最终解决回文的方法是利用两个乱序字符串具有相同的 a, b, c 等等的事实。我们首先计算的是每个字母出现的次数。由于有 26 个可能的字符,我们就用 一个长度为 26 的列表,每个可能的字符占一个位置。每次看到一个特定的字符,就增加该位置的计数器。最后如果两个列表的计数器一样,则字符串为乱序字符串。见 ActiveCode 3
8080

8181
```` python
8282
def anagramSolution4(s1,s2):

SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* [2.1.目标](2.算法分析/2.1.目标/README.md)
1414
* [2.2.什么是算法分析](2.算法分析/2.2.什么是算法分析/README.md)
1515
* [2.3.大O符号](2.算法分析/2.3.大O符号/README.md)
16-
* [2.4.一个回文字符串检查的例子](2.算法分析/2.4.一个回文字符串检查的例子/README.md)
16+
* [2.4.一个乱序字符串检查的例子](2.算法分析/2.4.一个乱序字符串检查的例子/README.md)
1717
* [2.5.Python数据结构的性能](2.算法分析/2.5.Python数据结构的性能/README.md)
1818
* [2.6.列表](2.算法分析/2.6.列表/README.md)
1919
* [2.7.字典](2.算法分析/2.7.字典/README.md)

0 commit comments

Comments
 (0)