热门标签 | 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。

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


推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
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社区 版权所有