获取两个字符串中最大相同字串(一)

题目

获取两个字符串中最大相同字串,比如:

  • str1 = “abcwerthelloyuiodef”,
  • str2 = “cvhellobnm”
  • 提示:
  • 将短的那个串,进行长度依次递减的字串与较长的字串进行比较
题解

这里先分析 两个字符串只有一个最大相同子串的情况:

(1)思路分析:

只有一个最大相同最子串的情况下:

---->跟找最大公约数的算法类似:先确定str1、str2哪个更短一下, 拿短的去比较深蓝色文字

比较的具体情况为:假设有:

  • str1 = “abcwerthelloyuiodef”,
  • str2 = “cvhellobnm”(length==10)


----利用string的contains(CharSequence s),判断maxstr中,是否包含每次的minstr(str2自己或者子串,具体的minstr是什么进行比对,取决于是哪一趟比较):

  • (1)整体的话,因为str2长度为10,则有10大轮的比较(每一轮结束minstr-1,即minstr的长度减少1)
  • (2)每一大轮中,具体的-1的情况也不太一样:
  • minstr的初值为str2:cvhellobnm
  • ①如果第一轮结束之后,contains()的返回值为false,将minstr的长度-1。
  • 完成length-1操作之后,对于下一次要进行contains()的minstr有2种情况:
  • cvhellobn 或者 vhellobnm
  • ②如果第二轮结束之后,contains()的返回值为false,将minstr的长度-1。
  • 在①的基础上,完成length-1操作之后,对于下一次要进行contains()的minstr有4种情况:
  • cvhellob、vhellobn 或者 vhellobn、hellobnm

  • 也即,每次进行length-1 的操作,有两种可能:
  • 从当前minstr的首部-1,或者从当前minstr的尾部-1
  • –>设置两个指针,来完成这个功能:
  • start、end

(2)实现主要功能的代码块:

/*
* 将短的那个串,进行长度依次递减的字串与较长的字串进行比较 外层循环控制的是:一共可以length-1进行多少次(第一次不进行-1,直接比较)
*/
			for (int i = 0; i < minString.length(); i++) {
   
				/*
				 * 因为 substring()的截取区间是左开右
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C知道: 想要找到一个字符串最长的两个完全独立的相同子串,可以通过遍历字符串的所有子串,然后在每个子串查找是否存在完全独立的相同子串。下面是一个示例的解决方案: 1. 遍历所有可能的子串,可以使用两个嵌套循环来实现。外层循环控制子串的起始位置,内层循环控制子串的长度。 2. 对于每个子串,检查是否存在另一个相同的子串。可以通过比较两个子串是否相等来判断。 3. 如果找到了一个相同的子串,继续检查它是否与已找到的最长子串独立。也就是说,它不能与已找到的最长子串重叠。 4. 如果满足条件,更新最长子串的长度和内容。 5. 最后返回找到的最长子串。 以下是一个使用Python语言实现的示例代码: ```python def find_longest_independent_substrings(string): longest_substring = "" max_length = 0 for i in range(len(string)): for j in range(i+1, len(string)): substring = string[i:j] if substring in string[j:]: continue if len(substring) > max_length: longest_substring = substring max_length = len(substring) return longest_substring # 调用函数并打印结果 input_string = "abracadabra" result = find_longest_independent_substrings(input_string) print("最长的两个完全独立的相同子串为:", result) ``` 请注意,这只是一个简单的示例实现,可能不是最优解。在实际应用,可能需要考虑进行优化以提高效率。希望这能帮到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值