【问题标题】:minimum number of slice required to make strings equal使字符串相等所需的最小切片数
【发布时间】:2021-12-28 13:41:09
【问题描述】:

有人可以帮我解决这个问题吗?

使字符串 A 等于字符串 b 所需的最小切片数是多少?

例子:

String A = "gamergirls"
String B = "merils"

| mer | g | | r | ls -> 5 片做麦片。

约束:

  • 两个字符串中的字符都是小写的。
  • A.length && B.length

【问题讨论】:

  • 请帮助我,我找不到尝试这个问题的正确方法。
  • 看看 Smith-Waterman 算法。虽然它主要用于 DNA 序列比对,但您在这里需要的是找到所需的最少插入数。
  • 我不懂 Smith-Waterman 算法。我是一名高中生。尽量保持简单。 @user1717259
  • 您是否解决了这个问题,或者您是否有任何在线链接可以让我们测试我们的解决方案?
  • 是的,我在解决最长公共子串问题时突然想到它。我没有这样的链接

标签: java string algorithm function lcs


【解决方案1】:
  • 正如您在 cmets 中提到的那样,我提出了一个 O(AnCBn) 解决方案,其中An是字符串A 的长度,Bn 是字符串B 的长度。

  • 空间复杂度为O(An),其中An 是字符串A 的长度。


算法:

  • 我们首先使用AB 的长度进行简单检查。如果B 更长,则返回-1。如果两者的长度相同,则返回0,否则返回-1

  • 对于A.length() > B.length()

    • 我们检查每个可能的子序列,其长度为A,长度为B,其中的1 个数。对于您的示例,我下面代码中的 bits 数组最初看起来像,

      0 0 0 0 1 1 1 1 1 1
      
    • 这个bits 数组基本上意味着我们要检查它的每一个 可能的排列,包括上面的排列,看看A 的任何子序列是否匹配这个。 1 位应与B 中的相应字符匹配,否则为失败排列。

    • 如果bits 的任何排列匹配,我们计算编号。使其成功所需的削减。对于您的示例,bits 数组的排列如下所示,

      0 0 1 1 1 0 1 0 1 1
      -------------------
      g a m e r g i r l s
      
    • 如您在上面看到的,我们有0s 和1s 的6 个段。最后,我们只是将所有可能的可能性降到最低,然后返回。

主代码:

int min_cuts = Integer.MAX_VALUE;
do{
    int ptr = 0;
    for(int i=0;i<bits.length && ptr < B.length();++i){
        if(bits[i] == '1'){
            if(A.charAt(i) == B.charAt(ptr)){
                ptr++;
            }else{
                break;
            }
        }
    }

    if(ptr == B.length()){
        min_cuts = Math.min(min_cuts, getCuts(bits) - 1);
    }
}while(nextPermutation(bits));

Complete Online Demo

【讨论】:

  • 感谢@nice_dev 的帮助。我感谢你的努力。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2020-11-27
  • 1970-01-01
  • 2015-11-26
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多