感觉用递归写但找不到出口,或者有什么其他好的方法吗
#include<bits/stdc++.h>using namespace std;
int l,r,k;
voidsolve(string &s)
{
cin>>l>>r>>k;
l--,r--;
string ans1,ans2,ans3,ans;
int len=s.size();
ans2=s.substr(l,r-l+1);
// cout<<ans1<<" "<<ans2<<" "<<ans3<<endl;
int size=ans2.size();
for(int i=0;i<k;i++)
{
ans1=s.substr(0,l);
ans3=s.substr(r+1,len-r-1);
ans2=ans2+ans2.substr(0,r-l);
}
ans=ans1+ans2+ans3;
solve(ans);
cout<<ans<<endl;
}
int main()
{
string s;
cin>>s;
int n;
cin>>n;
while(n--)
{
solve(s);
}
} 递归是一种解决问题的常用方法,但并不是适用于所有情况,有时候也可以使用其他的方法来解决问题。
在你提供的代码中,递归并不是必需的。根据代码的需求,你可以直接使用字符串的substr函数来获取子字符串。这个函数的参数是起始索引和需要获取的子字符串的长度。在你的代码中,你已经计算了起始索引l和子字符串的长度r-l+1,所以可以直接使用substr函数来获取子字符串ans2。
下面是修改后的代码:
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
int l, r, k;
cin >> l >> r >> k;
l--, r--;
string ans2 = s.substr(l, r - l + 1);
cout << ans2 << endl;
return 0;
}
这样,你就可以直接打印出子字符串ans2了。
希望能帮到你!如果还有其他问题,请继续提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 本帖最后由 柿子饼同学 于 2023-11-23 21:46 编辑
不用递归啊 , 顺次修改就好
下面是我的代码
如果你想用递归的话 , 可以在最后加一个判断 , 如果 n == 0 就打印答案 , 然后返回
#include <bits/stdc++.h>
using namespace std;
string s;
int n;
void Modify(int l, int r, int k){
l--, r--;
k %= (r - l + 1); // 这里是为了 k 不会超出 s 的范围, 取模不会影响答案, 多转整个一圈不会改变答案
string temp = s.substr(r - k + 1, k); // 要从前面出来的那个部分, 是 s
for(int i = r - k; i >= l; i--) s = s; // 前面的倒着偏移 k
for(int i = 0; i < k; i++) s = temp; // 后面的补回来
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> s >> n;
while(n--){
int l, r, k;
cin >> l >> r >> k;
Modify(l, r, k); // 顺次修改就好
}
cout << s;
return 0;
}
页:
[1]