通过设置仅包含K个位的子字符串,将二进制字符串的汉明距离最小化

通过设置仅包含k个位的子字符串,将二进制字符串的汉明距离最小化

两个等长字符串之间的汉明距离是在对应位置上存在不同值的所有位置的数量。我们可以通过下面的示例来理解:

S= “ramanisgoing”

的中文翻译为:

S= “ramanisgoing”

T=“dishaisgoing”

这里,5 是两个字符串 S 和 T 之间的汉明距离,因为 raman 和 disha 是两个使字符串中的差异变得相等的单词。

问题陈述

然而,在这个问题中,我们需要找到仅包含二进制数字的两个字符串之间的汉明距离。一个字符串将由用户提供,假设为S,另一个字符串,假设为T,最初,我们假设它只包含’0’位,并且与给定字符串的大小相等。我们将得到一个数字’k’,其值表示一个子字符串可以由仅为其元素的’1’组成的元素数量,以便我们将该大小为k的子字符串放在字符串(T)的任何位置,以最小化两个子字符串S和T之间的汉明距离。

让我们通过一些例子来尝试理解这个问题。

输入 − S = “100111” K = 5

输出 – 3

Explanation − 初始字符串 T 等于“000000”,并且字符串 T 会被改变以与字符串 S 进行比较,以找到 k=5 时的最小汉明距离,如下所示:“111110”和“011111”。

100111和000000的海明距离为4。100111和111110的海明距离为3,而100111和011111的海明距离也为3。

但是最小的汉明距离将为3,因为3小于4。因此,我们的答案是3。

– S =“100101”K = 5

– 3

− 作为初始字符串T将等于“000000”,并且字符串T将被更改以与字符串S进行比较,以找到k=5时的最小汉明距离,如下所示:“111110”和“011111”。

100101和000000的汉明距离为3。100101和111110的汉明距离为4,而100101和011111的汉明距离也为4。

但是最小的汉明距离将为3,因为3小于4。因此,我们的答案是3。

问题解释

让我们试着理解这个问题并找到解决办法。

解决方案1 暴力解决方案

我们将通过改变不同初始和结束点的子字符串的位置来修改字符串T,以便在所有可能的字符串中获得最小的汉明距离。

示例

下面是上述方法的C++程序实现:

#include using namespace std;// Make a function to get minimum hamming distance through iterationint helper(string S,int k){   // n is the size of the string   int n=S.size();   // Take another string T and initiate it with zero bits size equal to that of S   string T;   for(int i=0;i<n;i++){      T+="0";   }   // Take another string v to initiate it same as T   string v=T;   // Define mini as the hamming distance between T and S   int mini=0;   int l=0;    while(l<n){      if(S[l]!=T[l])mini++;         l++;   }   for(int i=0;i<n-k+1;i++){      int j=0,a=0,l=0;      // alter string v by changing bits of size k      while(j<k){          v[j+i]='1';          j++;      }      // calculate hamming distance      while(la){         mini=a;      }      // Again assign v as the T string      v=T;    }    // return the minimum hamming distance found through the above iterations    return mini;}int main() {   // Give input string S   string S = "100101";   // Give the value of k that is the substring size   int K = 5;   // Call the helper function   cout << "The minimum hamming distance is: "<< helper(S,K);   return 0;}

输出

The minimum hamming distance is: 3

解决方案2 优化方案

算法

使用前缀和数组计算1的数量,并将其存储为我们的最小汉明距离

遍历字符串S以找到字符串S中K个不同子字符串之间的值。

如果(i-1

通过查找前一个汉明距离和当前汉明距离之间的最小值来存储最小值。

当前的汉明距离可以通过对(K – v)子字符串中零元素的数量和当前S子字符串中零的数量进行操作来找到

最后,返回整体最小距离。

示例

下面是上述方法的C++程序实现

#include using namespace std;// Make a helper function to get minimum hamming distance through iterationint helper(string S, int K){ // n is the size of the stringint n = S.size();// initialize an array of size 'n'int arr[n];if(S[0]=='0')arr[0]=0;else arr[0]=1;// Count the number of 1's in the string Sfor (int i = 1; i < n; i++){    if(S[i]=='0')arr[i]=arr[i-1];    else arr[i]=arr[i-1]+1;}int cnt = arr[n - 1];// Define mini as the hamming distance between T and Sint mini = cnt;// Traverse through S to find the minimumfor (int i = 0; i < n - K; i++) {int v;if(i-1==-1)v=arr[i+K-1];else v= arr[i+K-1]-arr[i-1];// Store the minimummini = min(mini, cnt - v + (K - v));}    // Return the minimum hamming distancereturn mini;}int main(){// Give input string S    string S = "100101";    // Give the value of k that is the substring size    int K = 5;    // Call the helper function    cout << "The minimum hamming distance is: "<< helper(S,K);    return 0;}

输出

The minimum hamming distance is: 3

结论

在本文中,为了找到最小的汉明距离,我们首先会看到一种简单的方法,但为了改进其时间复杂度,我们将使用前缀和数组的概念,通过它我们可以在一个循环中避免重复计数。

以上就是通过设置仅包含K个位的子字符串,将二进制字符串的汉明距离最小化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:31:38
下一篇 2025年12月17日 10:27:29

相关推荐

  • 在C++中,将一个二进制数的一位移除以获得最大值

    讨论一个给定二进制数的问题。我们必须从中删除一点,以便剩余的数字应该是所有其他选项中的最大值,例如 Input : N = 1011Output: 111Explanation: We need to remove one bit so removing 0 bit will give a maxi…

    2025年12月17日
    000
  • 使一个字符串等于另一个字符串所需删除的最长子字符串的长度

    在本文中,我们将讨论找到需要删除的最长子字符串的长度以使一个字符串等于另一个字符串的问题。我们将首先理解问题陈述,然后探索解决该问题的简单和有效的方法,以及它们各自的算法和时间复杂度。最后,我们将用 C++ 实现该解决方案。 问题陈述 给定两个字符串 A 和 B,确定需要从字符串 A 中删除的最长子…

    2025年12月17日
    000
  • C++程序,使用递归将二进制数转换为格雷码

    格雷码或反射二进制码是一种特殊类型的数字二进制表示形式,其中两个连续值仅在一位上不同。例如,1和2的二进制等价物是01和10,这里有两个位正在改变。但在格雷码中,1是01,2是11,只有一位在变化。在本文中,我们将了解如何使用 C++ 中的递归将给定的二进制数转换为其等效的格雷码。 将数字作为十进制…

    2025年12月17日
    000
  • 具有相同数量小写字母和大写字母的子字符串数量

    在这个问题中,我们需要计算给定字符串中包含相同数量的小写和大写字符的字符串的总数。解决这个问题的朴素方法是找到所有的子字符串,并计算具有相同数量的小写和大写字符的子字符串的总数。 有效的方法是使用子数组求和问题。我们可以将小写字符视为-1,将大写字符视为+1,我们将学习这两种方法来解决问题。 问题陈…

    2025年12月17日
    000
  • 将以下内容翻译为中文:使用递归在C程序中将二进制转换为格雷码

    二进制数是只有两位 0 和 1 的数字。 格雷码是一种特殊类型的二进制数,其属性是代码的两个连续数字 em> 的差异不能超过一位。格雷码的这一特性使其在 K-map、纠错、通信等方面更加有用。 这使得二进制到格雷码的转换成为必要。那么,让我们看一下将二进制转换为格雷码的算法使用递归。 示例 让…

    2025年12月17日
    000
  • 二进制字符串的字典序排名

    在本文中,我们将探讨一个涉及二进制字符串和词典序的有趣问题。我们的任务是找到给定二进制字符串的词典序排名。我们将使用C++来演示我们的解决方案,C++是一种以其高效性和灵活性而闻名的流行编程语言。 理解词典顺序 词典顺序(也称为字母顺序或字典顺序)是指根据单词的组成字母的字母顺序排列单词。 问题陈述…

    2025年12月17日
    000
  • 安排一个二进制字符串,以在索引范围内获得最大值。C/C++?

    对于一个由0和1组成的给定字符串,我们给出了M个不相交的范围A,B(A 活动是找到一个合法或有效的排列,同时满足以下两个条件− 所有M个给定范围之间的数字之和最大。 字符串将是字典序最大的。字符串1100的字典序比字符串1001高。 立即学习“C++免费学习笔记(深入)”; 示例 Input1110…

    2025年12月17日
    000
  • 将两个数字的二进制表示长度调整为相等后进行异或运算

    XOR,或异或,是一种布尔逻辑运算,用于生成奇偶校验位,用于错误检查、容错等。使用各种符号来表示此运算:^、⊕、⊻等。 异或逻辑 仅当两个参数不同时,XOR 运算才为真。也就是说,相同位异或为0,不同位异或为1。 相同的位 – 0^0=0 1^1=0 不同的位 − 0^1=1 1 ^ 0…

    2025年12月17日
    000
  • 根据给定条件,从数组中构建一个长度为K的二进制字符串

    在本教程中,我们需要构造一个长度为 K 的二进制字符串,如果使用数组元素可以实现等于 I 的子集和,则它的第 i 个索引处应包含“1”。我们将学习两种解决问题的方法。在第一种方法中,我们将使用动态规划方法来检查子集和等于索引“I”是否可能。在第二种方法中,我们将使用位集通过数组元素查找所有可能的和。…

    2025年12月17日
    000
  • 排序二进制字符串所需删除的最小字符数,以使其按升序排列

    在计算机科学中,字符串操作是一个重要的主题,涉及到拼接、子串、反转等操作。与字符串操作相关的一个常见问题是从二进制字符串中移除所有的0。在本文中,我们将讨论一种使用最少数量的非相邻对翻转来解决这个问题的算法。 问题陈述 给定一个二进制字符串,我们必须使用最少次数的非相邻对翻转来删除字符串中的所有 0…

    2025年12月17日
    000
  • 十进制转二进制的C程序?

    将整数从十进制 (base-10) 转换为二进制 (base-2)。假设整数的大小为 32 位,需要将数字除以基数。计算机使用它来将整数值更改为计算机的字节。 Input:10Output:1010 说明 如果十进制数是10 10除以2余数为零。因此,0。 将 10 除以 2。新数字为 10/2 =…

    2025年12月17日
    000
  • 计算三个不重叠的子字符串,将它们连接起来形成一个回文串

    简介 在本教程中,我们将详细阐述一种从给定字符串 s 中查找三个不重叠子字符串的方法,并且当所有子字符串组合在一起时,它们形成一个回文。为了解决此任务,我们使用 C++ 编程语言的字符串类功能。 字符串中的回文表示该字符串在向前和向后方向上读起来都相同。回文字符串示例是 Madam。 假设有一个字符…

    2025年12月17日
    000
  • 计算长度为N的二进制字符串,它们是子字符串的重复拼接

    本文的目的是实现一个程序,用于计算由一个子字符串重复连接而成的长度为N的二进制字符串的数量。 目标是确定通过重复连接给定文本的单个子字符串,可以创建多少长度为N的二进制字符串,其中N是一个正整数。 问题陈述 实现一个程序,用于计算重复连接子字符串的长度为N的二进制字符串的数量。 示例示例1 Let …

    2025年12月17日
    000
  • 十进制转二进制的C语言程序实现

    问题 如何使用C语言中的函数将十进制数转换为二进制数? 解决办法 在在这个程序中,我们在 main() 中调用一个二进制函数。被调用的二进制数转换函数将执行实际的转换。 我们使用的将十进制数转换为二进制数的调用函数的逻辑如下 – while(dno != 0){ rem = dno % …

    2025年12月17日 好文分享
    000
  • 查询字符串A中是否存在字符串B作为子字符串

    介绍 In this tutorial, we will see queries to check if string B exists as a substring of string A. A substring is a string that is part of the main stri…

    2025年12月17日
    000
  • 如何使用C语言将二进制转换为十六进制?

    二进制数以 1 和 0 表示。 16 位的十六进制数系统为 {0,1,2,3…..9, A(10), B(11),… …F(15)} 为了从二进制表示转换为十六进制表示,位串 id 被分组为 4 位块,从最低有效侧开始称为半字节。每个块都替换为相应的十六进制数字。 让我们看一个示例,以清楚地了解十六…

    2025年12月17日
    000
  • 检查三个给定字符串的子字符串是否可以连接成回文串

    回文是计算机科学和编程中的一个迷人话题。回文是一个单词、短语、数字或其他字符序列,从前往后读和从后往前读是一样的,忽略空格、标点和大小写。在本文中,我们将研究一个独特的问题:如何确定从三个给定的字符串中的子字符串是否可以连接起来形成一个回文。这个问题是一个常见的面试题,可以使用各种技术来解决,包括字…

    2025年12月17日
    000
  • 最大可能的平衡二进制子字符串拆分,最多花费k个

    The array in the C programming language has a fixed size, which means that once the size is specified, it cannot be changed; you can neither shrink it…

    2025年12月17日
    000
  • 检查给定的二进制矩阵中是否存在连续的T个0的块

    简介 二元矩阵广泛应用于计算机科学和各个领域,以有效地表示数据或解决复杂问题。在某些情况下,识别给定的二进制矩阵是否包含连续的零块变得很重要。在本文中,我们将使用 C++ 代码探索一种优雅的解决方案,该解决方案允许我们检测给定二进制矩阵中是否存在 T 个连续的零块。这种方法既直观又高效,适合实际实施…

    2025年12月17日
    000
  • XML与二进制格式比较?

    XML适合可读性和调试要求高的场景,二进制格式则在性能和存储效率上占优,选择取决于具体应用需求。 XML是文本可读、自描述的数据格式,但其冗余性导致文件体积较大且解析开销高;二进制格式则以紧凑、高效著称,文件体积小、解析速度快,但牺牲了人类可读性,且通常需要预定义的解析结构。选择哪种格式,核心在于在…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信