lsmCC 发表于 2023-11-23 19:40:07

感觉用递归写但找不到出口,或者有什么其他好的方法吗

#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);
    }
}

FishC_GPT 发表于 2023-11-23 19:40:42

递归是一种解决问题的常用方法,但并不是适用于所有情况,有时候也可以使用其他的方法来解决问题。

在你提供的代码中,递归并不是必需的。根据代码的需求,你可以直接使用字符串的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 19:55:07

本帖最后由 柿子饼同学 于 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]
查看完整版本: 感觉用递归写但找不到出口,或者有什么其他好的方法吗