C++ 中分割连接字符串


假设我们有一系列字符串,我们可以将这些字符串连接成一个循环,在循环中,对于每个字符串,我们可以选择是否反转它。在所有可能的循环中,我们需要找到在切割循环后词典序最大的字符串,这将使循环字符串变成一个普通字符串。具体来说,为了找到词典序最大的字符串,我们需要经历两个阶段:

将所有字符串连接成一个循环,我们可以反转一些字符串或不反转,并按照给定的顺序连接它们。

在循环的任何位置进行切割并设置一个切割点,这将使循环字符串变成一个从切割点开始的普通字符串。我们的任务是在所有可能的普通字符串中找到词典序最大的一个。

因此,如果输入类似于“abc”,“xyz”,则输出将为“zyxcba”,因为我们可以得到像“-abcxyz-”,“-abczyx-”,“-cbaxyz-”,“-cbazyx-”这样的循环字符串,其中“-”用于表示循环状态。答案字符串来自第四个循环字符串,我们可以在中间字符'a'处进行切割并得到“zyxcba”。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个函数 solve(),它将接收 idx、数组 strs、rev 作为参数。

  • temp := strs[idx]

  • 如果 rev 不为零,则:

    • 反转数组 temp

  • str1 := 空字符串

  • str2 := 空字符串

  • 对于初始化 i := 0,当 i < idx 时,更新(i 加 1),执行:

    • str1 := str1 + strs[i]

  • 对于初始化 i := idx + 1,当 i < strs 的大小 时,更新(i 加 1),执行:

    • str2 := str2 + strs[i]

  • 对于初始化 k := 0,当 k < temp 的大小 时,更新(k 加 1),执行:

    • newOne := 从 temp 的索引 k 到结尾的子字符串连接 str2 连接 str1 连接 temp 的索引 (0 到 k-1) 的子字符串

    • 如果 ret 为空或 ret < newOne,则:

      • ret := newOne

  • 定义一个函数 findMax(),它将接收数组 strs 作为参数。

  • 对于初始化 i := 0,当 i < strs 的大小 时,更新(i 加 1),执行:

    • temp := strs[i]

    • 反转数组 temp

    • strs[i] := (如果 strs[i] > temp,则 strs[i],否则 temp)

  • 从主方法执行以下操作:

  • ret := 空字符串

  • findMax(strs)

  • 对于初始化 i := 0,当 i < strs 的大小 时,更新(i 加 1),执行:

    • solve(i, strs, false)

    • solve(i, strs, true)

  • 返回 ret

示例

让我们看看以下实现以获得更好的理解:

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string ret;
   void solve(int idx, vector <string > strs, bool rev){
      string temp = strs[idx];
      if (rev)
         reverse(temp.begin(), temp.end());
      string str1 = "";
      string str2 = "";
      for (int i = 0; i < idx; i++)
         str1 += strs[i];
      for (int i = idx + 1; i < strs.size(); i++)
         str2 += strs[i];
      for (int k = 0; k < temp.size(); k++) {
         string newOne = temp.substr(k) + str2 + str1 + temp.substr(0, k);
         if (ret == "" || ret < newOne) {
            ret = newOne;
         }
      }
   }
   void findMax(vector<string>& strs){
      for (int i = 0; i < strs.size(); i++) {
         string temp = strs[i];
         reverse(temp.begin(), temp.end());
         strs[i] = strs[i] > temp ? strs[i] : temp;
      }
   }
   string splitLoopedString(vector& strs) {
      ret = "";
      findMax(strs);
      for (int i = 0; i < strs.size(); i++) {
         solve(i, strs, false);
         solve(i, strs, true);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<string> v = {"abc", "xyz"};
   cout << (ob.splitLoopedString(v));
}

输入

{"abc", "xyz"}

输出

zyxcba

更新于: 2020-11-16

471 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.