首页 新闻 会员 周边

字符串S被划分成若干子串后,求子串的最长公共前缀

2
悬赏园豆:20 [待解决问题]

面试遇到算法题大概描述:
有一个字符串S,现在需要把它划分成若干子串,各子串长度不能超过K,选择适当的划分方式,使得划分后的子串们具有最长公共前缀,返回其最长公共前缀

用例:S= 'ababc' K=3
返回: 'ab'
解释: S 可以被划分为 'ab','abc',子串长度都没有超过3,其最长公共前缀为‘ab’

求一个大佬帮忙给个思路 ,各种编程语言不限。

Ishuai的主页 Ishuai | 初学一级 | 园豆:184
提问于:2024-05-23 12:42
< >
分享
所有回答(5)
1

要解决这个问题,我们需要考虑如何高效地找到最长的公共前缀,同时确保子串的长度不超过给定的 K。以下是一个可能的算法步骤:

  1. 确定可能的起始点:因为每个子串的长度都不能超过 K,所以我们可以从字符串 S 的每个位置开始,每 K 个字符作为一个可能的子串起始点。
  2. 找到最长公共前缀:从每个可能的起始点开始,我们可以尝试找到一个最长的公共前缀。但是,由于我们想要最长的公共前缀,所以我们可以从最长的可能子串开始,并尝试向下缩减长度,直到找到一个公共前缀或无法再找到更长的公共前缀为止。
  3. 记录并返回结果:在遍历所有可能的起始点时,我们记录找到的最长公共前缀,并在遍历完成后返回它。
信念是基石 | 园豆:298 (菜鸟二级) | 2024-05-23 13:42

0-k之间划分字符串判断公共前缀 前缀长度0-k之间

支持(0) 反对(0) 信念是基石 | 园豆:298 (菜鸟二级) | 2024-05-23 13:43

整体字符串最前端0-k的字符串去在整个串的范围找

支持(0) 反对(0) 信念是基石 | 园豆:298 (菜鸟二级) | 2024-05-23 13:44

文字感觉有漏洞啊,上代码吧

支持(0) 反对(0) Ishuai | 园豆:184 (初学一级) | 2024-05-23 13:50
0

这个问题可以通过分治和遍历的方法来解决。我们的目标是将字符串 S 划分为若干长度不超过 K 的子串,使得这些子串的最长公共前缀尽可能长。

解题思路
划分子串:对于每个起点位置,尝试不同长度的子串划分,保证每个子串的长度不超过 K。
计算最长公共前缀:对于每种划分方式,计算这些子串的最长公共前缀。
选择最佳划分方式:选择最长公共前缀长度最大的划分方式,返回该前缀。
步骤详解
遍历起点:从字符串的起点开始,尝试不同的划分方式。
生成子串:对于每种划分方式,生成不超过 K 长度的子串。
计算前缀:使用一个辅助函数计算这些子串的最长公共前缀。
比较并选择:比较所有划分方式的最长公共前缀,选择长度最大的前缀。
实现
我们可以用 Python 来实现这个算法。具体步骤如下:

python
Copy code
def longest_common_prefix(strs):
if not strs:
return ""
min_len = min(len(s) for s in strs)
low, high = 0, min_len
while low <= high:
mid = (low + high) // 2
if all(s.startswith(strs[0][:mid]) for s in strs):
low = mid + 1
else:
high = mid - 1
return strs[0][:high]

def divide_and_find_prefix(S, K):
n = len(S)
max_prefix = ""

# We try to create the substrings with lengths from 1 to K
for start in range(n):
    substrings = []
    for i in range(start, n, K):
        substrings.append(S[i:i+K])
    
    # Calculate the longest common prefix of these substrings
    current_prefix = longest_common_prefix(substrings)
    
    # Update the max_prefix if the current one is longer
    if len(current_prefix) > len(max_prefix):
        max_prefix = current_prefix

return max_prefix

Test the function with the provided example

S = 'ababc'
K = 3
print(divide_and_find_prefix(S, K)) # Output should be 'ab'
解释代码
longest_common_prefix 函数:计算一组字符串的最长公共前缀。我们使用二分法来高效地找到前缀。
divide_and_find_prefix 函数:这是主函数,负责将字符串 S 划分成长度不超过 K 的子串,并找到这些子串的最长公共前缀。
遍历起点,从字符串的每个位置开始,尝试不同的划分。
将每种划分方式生成的子串存入列表 substrings。
调用 longest_common_prefix 计算这些子串的最长公共前缀。
记录最长的公共前缀。
这种方法通过穷举所有可能的划分方式,确保找到了最长的公共前缀。复杂度主要取决于字符串的长度和划分的次数,但由于每个子串长度不超过 K,所以在合理范围内是可行的。

Technologyforgood | 园豆:6772 (大侠五级) | 2024-05-23 20:28

人工智能写的吧,代码试过了,跑的结果不对,只返回来字符‘C’

支持(0) 反对(0) Ishuai | 园豆:184 (初学一级) | 2024-05-24 09:39
0

我给个思路吧,感觉挺粗暴,写代码感觉有点麻烦,我就不写了,估计代码耗时也较长。
因为你截断的字符串不会超过 K 长度,故重复的部分不会超过 K 长度,并且得到的第一个字符串肯定和源字符串重合,所以从数量1的开始遍历源字符串,获取它们在字符串的索引,然后切割字符串,看看符不符合要求,如果符合,那好,先暂存一下。然后接着从数量2开始遍历,直至结束。

寂静的羽夏 | 园豆:2059 (老鸟四级) | 2024-05-26 15:58
0

思路:
1、获取字符串首位字母。
2、遍历字符串按照首位字母分割字符串,如果分割字符串长度大于3,则不存在公共前缀。
3、获取分割后长度最小的元素
4、判断元素是否为最大前缀
代码(几分钟写的有点简陋)
PYTHON:
def test(S):
list_a = []
n = S[0]
c = ''
for i in S:
if n == i:
list_a.append(i+c)
c = ''
elif i !=n:
c += i
list_a.append(n+c)
return list_a[1:]

def length_str(list_a):
d = list_a[0]
for i in list_a:
if len(i)<len(d):
d = i
return d

def mx_len(list_a,d):
list_b = []
for i in list_a:
if d in i:
list_b.append(i)
else:
d = d[:-1]
if len(list_a) == len(list_b):
return d
else:
max_len(list_a,d)

上官发财 | 园豆:202 (菜鸟二级) | 2024-06-04 11:40
0

可以在字符串里搜字符串头n个字符

def split(s:str, K:int):
    for n in reversed(range(1,K+1)):
        head = s[:n]
        idx = 0
        while idx + K < len(s):
            idx = s.find(head, idx + n, idx + n + K)
            if idx < 0:
                break
        if idx + K >= len(s):
            return head
    return ""

ret = split("ababc", 3)
print(ret)
www378660084 | 园豆:368 (菜鸟二级) | 2024-06-06 20:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册