在C ++中拆分连接的字符串

假设我们有一个字符串列表,我们可以将这些字符串连接在一起形成一个循环,对于每个字符串,我们可以选择是否反转它。在所有可能的循环中,我们需要在剪切循环后找到按字典顺序排列的最大字符串,这将使循环后的字符串成为规则的字符串。具体来说,要找到词典上最大的字符串,我们需要经历两个阶段-

将所有字符串连接到一个循环中,在这里我们可以反转某些字符串,也可以不反转它们,并按给定的顺序连接它们。

在循环的任何位置剪切并创建一个剪切点,这将使循环的字符串从剪切点处的角色开始成为规则的字符串。这项工作是在所有可能的常规字符串中找到字典上最大的字符串。

因此,如果输入像“ abc”,“ xyz”,那么输出将是“ zyxcba”,因为我们可以得到像“ -abcxyz-”,“-abczyx-”,“-cbaxyz-”,“ -cbazyx-”,其中的“-”代表循环状态。答案字符串来自第四个循环的字符串,我们可以从中间字符“ a”处截取并得到“ zyxcba”。

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

  • 定义一个函数solve(),它将使用idx,数组strs,rev,

  • temp:= strs [idx]

  • 如果rev非零,则-

    • 反转阵列温度

  • 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 <临时大小时,更新(将k增加1),-

    • ret:= newOne

    • newOne:=从索引k到末尾的温度子串串联str2串联str1串联从索引(0到k-1)的温度子串

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

  • 定义一个函数findMax(),它将接受一个数组strs,

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

    • temp:= strs [i]

    • 反转阵列温度

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

  • 从主要方法中执行以下操作-

  • ret:=空字符串

  • findMax(strs)

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

    • 解决(i,strs,false)

    • 解决(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

以上是 在C ++中拆分连接的字符串 的全部内容, 来源链接: utcz.com/z/321609.html

回到顶部