Python程序以及如何在不使用内置函数的情况下获取两个字符串中的更大字符串
在Python中,有许多内置函数可以用来操作字符串,例如len()
获取字符串长度,split()
将字符串分割成列表等等。但是有时候需要在不使用这些内置函数的情况下对字符串进行操作,本文将介绍如何获取两个字符串中的更大字符串,同时提供示例代码。
获取两个字符串中的更大字符串
假设我们有两个字符串str1
和str2
,需要在不使用内置函数的情况下获取两个字符串中的更大字符串。
我们可以采用暴力匹配的方法来实现,即对于每一个子串,都从str1
和str2
中找出是否存在。如果存在,则继续找出更长的匹配子串。这种方法的时间复杂度为O(n^3),在实际运用中效率较低,因此我们可以采用一些优化的方法。
接下来我们介绍两种优化方法。
1. 动态规划
我们可以使用动态规划来优化暴力匹配的算法。具体来说,设dp[i][j]为以str1[i]
和str2[j]
结尾的公共子串的长度。如果str1[i]
和str2[j]
相等,则有dp[i][j] = dp[i-1][j-1]+1。否则,dp[i][j] = 0。在匹配时,我们只需要寻找最大的dp[i][j],即可得到最长的公共子串。
下面是实现动态规划的示例代码:
def dynamic_programming(str1, str2):
m, n = len(str1), len(str2)
dp = [[0] * n for _ in range(m)]
res = ""
for i in range(m):
for j in range(n):
if str1[i] == str2[j]:
if i == 0 or j == 0:
dp[i][j] = 1
else:
dp[i][j] = dp[i-1][j-1] + 1
if dp[i][j] > len(res):
res = str1[i-dp[i][j]+1:i+1]
else:
dp[i][j] = 0
return res
上述代码中,我们定义了一个二维数组dp
来保存以str1[i]
和str2[j]
结尾的公共子串的长度。同时,我们还定义一个字符串res
来记录最长的公共子串。在每一个位置(i, j)
上,如果str1[i]
和str2[j]
相等,则有dp[i][j] = dp[i-1][j-1] + 1。否则,dp[i][j] = 0。最后,我们只需要寻找最大的dp[i][j],即可得到最长的公共子串,并返回该子串。
2. 哈希表
如果字符串很长,动态规划的算法会耗费大量的时间和空间。因此,我们可以采用哈希表的方法来优化该算法。我们首先将str1
中的所有子串哈希,然后遍历str2
中的所有子串,判断是否出现在哈希表中。如果出现,则继续判断是否是更长的子串。
下面是实现哈希表的示例代码:
def hash_table(str1, str2):
m, n = len(str1), len(str2)
hash_table = {}
res = ""
base, mod = 131, 10 ** 9 + 7
def hash_func(s):
ans = 0
for c in s:
ans = (ans * base + ord(c)) % mod
return ans
上述代码中,我们定义了一个哈希表hash_table
来保存str1
中的所有子串。同时,我们还定义了一个字符串res
来记录最长的公共子串。在哈希时,我们选用了一个适合字符串哈希的算法,hash(s) = (\sum_{i=0}^{|S|-1}S[i]\times BASE^i)\%MOD,其中BASE和MOD为两个随意选取的数字,ord(c)表示字符c
的ASCII码值。在遍历str2
中的所有子串时,我们只需要判断该子串是否出现在哈希表中,如果出现,则继续判断是否是更长的子串,并更新res
。最后,我们返回res
即可。
示例代码
下面是两种优化方法的完整示例代码:
# 动态规划
def dynamic_programming(str1, str2):
m, n = len(str1), len(str2)
dp = [[0] * n for _ in range(m)]
res = ""
for i in range(m):
for j in range(n):
if str1[i] == str2[j]:
if i == 0 or j == 0:
dp[i][j] = 1
else:
dp[i][j] = dp[i-1][j-1] + 1
if dp[i][j] > len(res):
res = str1[i-dp[i][j]+1:i+1]
else:
dp[i][j] = 0
return res
# 哈希表
def hash_table(str1, str2):
m, n = len(str1), len(str2)
hash_table = {}
res = ""
base, mod = 131, 10 ** 9 + 7
def hash_func(s):
ans = 0
for c in s:
ans = (ans * base + ord(c)) % mod
return ans
for i in range(m):
for j in range(i+1, m+1):
hash_table[hash_func(str1[i:j])] = str1[i:j]
for i in range(n):
for j in range(i+1, n+1):
tmp = str2[i:j]
if hash_func(tmp) in hash_table and len(tmp) > len(res):
res = tmp
return res
结论
本文介绍了如何在不使用内置函数的情况下获取两个字符串中的更大字符串。我们介绍了两种优化方法,分别使用动态规划和哈希表来求解。在实际应用中,我们可以根据实际情况选择不同的方法。