'lintcode 连接字符串'

描述

给定一个字符串列表,您可以将这些字符串连接到一个循环中,在这个循环中,您可以选择将其反转。在所有可能的循环中,您需要在删除循环之后找到字母顺序最大的字符串,这将使循环字符串成为一个普通的字符串。

具体来说,要找到字母顺序上最大的字符串,您需要经历两个阶段:
  1:将所有字符串连接到一个循环中,在这个循环中,您可以反转某些字符串,并按照给定的顺序将它们连接起来。
  2:在循环的任意位置切割并制造一个断点,这将使从字符处开始循环的字符串成为一个正常的字符串,你的任务是在所有可能的规则字符串中找到字母顺序上最大的一个。

样例

给定 str = [“abc”, “xyz”], 返回 “zyxcba”

解释:
你可以得到循环字符串“-abcxyz-”,“-abczyx-”,“-cbaxyz-”,“-cbazyx-”,
其中“-”表示循环状态。
答案字符串串从第四个字符串中得来,
你可以从中间的字母a中剪切,得到“zyxcba”。

思路

最终要找到的是一个最大的字符串,所以最后的每个除了被切割的字符串在内部必然是递减的。这样第一步就可以明确了,按照自身递减的顺序把所有的字符串连接起来。下一步要明确的就是要切割哪个字符串的哪个字符,要不要翻转。只需要一个遍历即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
/**
* @param strs: a list of string
* @return: return a string
*/
string splitLoopedString(vector<string> &strs) {
// write your code here
string s = "";
for (int i = 0; i < strs.size(); i++) {
string temp = strs[i];
reverse(temp.begin(),temp.end());
if (temp > strs[i])
s += temp;
else
s += strs[i];
}
string res = s;
int n = s.length(), sum = 0;
for (int i = 0; i < strs.size(); i++) {
string temp = s;
reverse(temp.begin()+sum,temp.begin()+sum+strs[i].length());
for (int j = 1; j < strs[i].length(); j++) {
res = max(res, max(temp.substr(j+sum,n-j)+temp.substr(0,j+sum), s.substr(j+sum,n-j)+s.substr(0,j+sum)));
}
sum += strs[i].length();
}
return res;
}
};
-------------end of file thanks for reading-------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值