描述
游游拿到了一个长度为n的字符串,她每次操作会选择一个区间[l,r],将第l个字母到第r个字母各重复一次,插入到该字母的后面。
例如,对于字符串"abcd",若选择区间[2,3]进行操作,字符串将变成"abbccd"
游游将进行q次操作。她想知道,q次操作结束后,最终的字符串是什么样子?
输入描述:
第一行输入两个正整数n和q,分别代表字符串长度和操作次数。
第二行输入一个仅由小写英文字母组成的字符串,代表初始的字符串。
接下来的q行,每行输入两个正整数l,r,代表操作的区间。
1≤n≤1000
1≤q≤10
1≤l≤r≤10^6
保证每次操作时,r不大于当前的字符串长度。输出描述:
一个字符串,代表所有操作结束后形成的字符串。
示例1
输入:
6 2 abcdef 2 4 3 6输出:
abbbccccdddef说明:
第一次操作后,字符串变成abbccddef
第二次操作后,字符串变成abbbccccdddef
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.给定一个字符串,将指定区间的字母翻倍
2.翻倍的方法是,在在每个字母后面插入一个相同的字母
二、解题思路
1.首先定义长度n,操作次数q,读取数据
2.然后定义两个整数l和r用于读取区间
3.定义一个字符串answer,为其分配足够的内存空间
4.空间是原字符串长度+(r - l + 1)
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {int n, q;while (scanf("%d %d", &n, &q) != EOF) {char *str = (char*)malloc(sizeof(char) * (n + 1));if(str == NULL) {printf("内存分配失败");return 0;}scanf("%s",str);str[n] = '\0';int l, r;for(int i = 0; i < q; i++) {scanf("%d %d", &l, &r);int len = strlen(str);char* tmp = (char*)malloc(sizeof(char) * (len + r - l + 1));for(int j = 0; j < l - 1; j++) {tmp[j] = str[j];}int index = l - 1;for(int j = l - 1; j < r; j++) {tmp[index] = str[j];index++;tmp[index] = str[j];index++;}for(int j = r; j < len; j++) {tmp[index] = str[j];index++;}tmp[index] = '\0';str = tmp;}printf("%s\n",str);}return 0;
}