Split Concatenated Strings (Leetcode 555)

Alibaba的题,这道题我参照了下面的解法,非常巧妙.

https://discuss.leetcode.com/topic/87446/java-straight-forward-method-with-explanation

第一步,我们update原string array,如果strs[i].reverse > strs[i], 则strs[i] = strs[i].reverse. 这步是需要的,在做第二步时,可以确保mid string是最优的

第二步,对于一个string array,比如 "abc", "def", "xyz", 我们先生成一个mid string,mid string没有最后一个string,比如"abcdef". 然后我们update mid string:

mid = mid.substr(str.length()) + strs[(i+n-1) % n];

这样mid string就变成 defxyz(由abcdef,去掉abc,加上xyz),xyzabc.

然后我们扫原string array中的每一个string,生成相应的截取result。比如对于abc,我们有mid string = defxyz, 所以组合是:
正序:abc-defxyz, bc-defxyz-a, c-defxyz-ab, defxyz-abc
反序:cba-defxyz, ba-defxyz-c, a-defxyz-cb, defxyz-cba,
然后我们所有循环中挑出全局最大的.

class Solution {
public:
    string splitLoopedString(vector<string>& strs) {
        if(strs.empty()) return "";
        else if(strs.size() == 1) return max(strs[0], string(strs[0].rbegin(), strs[0].rend()));
        string all = "";
        int n = strs.size();
        for(int i=0; i<n; i++){
            string temp = string(strs[i].rbegin(), strs[i].rend());
            if(temp > strs[i]) strs[i] = temp;
        }
        for(int i=0; i<n-1; i++){
            all += strs[i];
        }
        string result = all + strs[n-1];
        for(int i=0; i<n; i++){
            string str = strs[i], rev = string(strs[i].rbegin(), strs[i].rend());
            all = all.substr(str.length()) + strs[(i+n-1) % n];
            for(int j=0; j<=str.length(); j++){
                string s1 = str.substr(j) + all + str.substr(0, j), s2 = rev.substr(j) + all + rev.substr(0, j);
                if(s1 >= s2 && s1 > result) result = s1;
                else if(s2 >= s1 && s2 > result) result = s2;
            }
        }
        return result;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,348评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,896评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,228评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,306评论 19 139
  • 数组是一种可变的、可索引的数据集合。在Scala中用Array[T]的形式来表示Java中的数组形式 T[]。 v...
    时待吾阅读 4,563评论 0 0