热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

替换为K长度回文字符串的字符串连接的最小字符

替换为K长度回文字符串的字符串连接的最小字符原文:http

替换为 K 长度回文字符串的字符串连接的最小字符

原文: https://www.geeksforgeeks.org/minimum-characters-to-be-replaced-to-make-a-string-concatenation-of-a-k-length-palindromic-string/

给定大小为N的字符串S和正整数K(其中 N%K = 0) ,任务是找到需要替换的最小字符数,以使该字符串为K-句点,而K-长度的定期字符串必须为[回文 。

示例

输入:S =“ abaaba”,K = 3
输出:0
说明:给定的字符串已经是 K 周期且 定期字符串“ aba”是回文的。

输入:S =“ abaaba”,K = 2
输出:2
说明:将索引 1 和 4 的字符更改为 “ a”,更新的字符串“ aaaaaa”是 K 周期,而周期字符串“ aa”是回文。 因此,要求的最小更改为 2。

方法:的想法是从给定的字符串索引创建图,并执行 DFS 遍历以查找所需的更改次数。 请按照以下步骤解决此问题:


  • 将总计为的变量初始化为0,以存储所需的更改计数。


  • 根据给定的条件,从字符串创建图形,并在最终字符串中的所有位置 i,K − i + 1,K + i,2K − i + 1、2K + i,3K − i + 1,…对于所有 1≤i≤K应该相等。


  • [0,N] 范围内进行迭代,并在索引i(N – i – 1)之间添加无方向的边。


  • [0,N – M] 范围内迭代,并在索引i(i + K)之间添加无方向的边。


  • 为了最大程度地减少所需的操作次数,请使所有字母最多等于出现在这些位置的字母,只需对字符串执行 DFS 遍历即可轻松找到。


  • 对所有未访问的节点,在创建的图形上执行 DFS 遍历


    • 在该遍历中访问的字符中找到频率最高的最大元素(例如 maxFrequency )。


    • 通过 DFS 遍历中所有已访问字符的计数与上一步中的最大频率之差,更新字符的更改总数。




  • 完成上述步骤后,打印总计的值作为结果。


下面是上述方法的实现:

C++

// C++ program for the above approach
#include "bits/stdc++.h"
using namespace std;
// Function to add an edge to graph
void addEdge(vector adj[], int u,
             int v)
{
    adj[u].push_back(v);
    adj[v].push_back(u);
}
// Function to perform DFS traversal on the
// graph recursively from a given vertex u
void DFS(int u, vector adj[],
         int& cnt, vector& visited,
         int fre[], string S)
{
    // Visit the current vertex
    visited[u] = true;
    // Total number of nodes
    // in this component
    cnt++;
    // Increment the frequency of u
    fre[S[u] - 'a']++;
    for (int i = 0;
         i         if (!visited[adj[u][i]]) {
            DFS(adj[u][i], adj, cnt,
                visited, fre, S);
        }
    }
}
// Function for finding the minimum
// number changes required in given string
int minimumOperations(string& S, int m)
{
    int V = 100;
    vector adj[V];
    int total = 0, N = S.length();
    // Form the edges according to the
    // given conditions
    for (int i = 0; i         addEdge(adj, i, N - i - 1);
        addEdge(adj, N - i - 1, i);
    }
    for (int i = 0; i         addEdge(adj, i, i + m);
        addEdge(adj, i + m, i);
    }
    // Find minimum number of operations
    vector visited(V, 0);
    for (int i = 0; i         // Frequency array for finding
        // the most frequent character
        if (!visited[i]) {
            // Frequency array for finding
            // the most frequent character
            int fre[26] = { 0 };
            int cnt = 0, maxx = -1;
            DFS(i, adj, cnt, visited, fre, S);
            // Finding most frequent character
            for (int j = 0; j <26; j++)
                maxx = max(maxx, fre[j]);
            // Change rest of the characters
            // to most frequent one
            total += cnt - maxx;
        }
    }
    // Print total number of changes
    cout <}
// Driver Code
int main()
{
    string S = "abaaba";
    int K = 2;
    // Function Call
    minimumOperations(S, K);
    return 0;
}

Output:

2

时间复杂度O(N)

辅助空间O(N)




如果您喜欢 GeeksforGeeks 并希望做出贡献,则还可以使用 tribution.geeksforgeeks.org 撰写文章,或将您的文章邮寄至 tribution@geeksforgeeks.org。 查看您的文章出现在 GeeksforGeeks 主页上,并帮助其他 Geeks。

如果您发现任何不正确的地方,请单击下面的“改进文章”按钮,以改进本文。


推荐阅读
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 去掉空格的方法——Python工程师招聘标准与实践
    本文介绍了去掉空格的方法,并结合2019独角兽企业招聘Python工程师的标准与实践进行讨论。同时提供了一个转载链接,链接内容为更多相关信息。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • CentOS7.8下编译muduo库找不到Boost库报错的解决方法
    本文介绍了在CentOS7.8下编译muduo库时出现找不到Boost库报错的问题,并提供了解决方法。文章详细介绍了从Github上下载muduo和muduo-tutorial源代码的步骤,并指导如何编译muduo库。最后,作者提供了陈硕老师的Github链接和muduo库的简介。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
author-avatar
飞翔的小鸟52588
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有