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

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


推荐阅读
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
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社区 版权所有