lintcode 连接字符串

给定一个字符串列表,需要找到所有可能的循环连接方式并去除循环后,字母顺序最大的字符串。例如,输入['abc', 'xyz'],返回'zyxcba'。通过将字符串按逆序连接并寻找最佳切割点,可以找到最大顺序的字符串。" 125702392,5107701,Java POI 3.9 动态生成多sheet多列头合并Excel,"['Java POI实现导入导出', 'Excel处理', 'Java开发', '数据导出', '办公自动化']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lintcode 连接字符串

描述

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

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

样例

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

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

思路

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

代码

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值