leetcode 1181. 前后拼接(C++)

给你一个「短语」列表 phrases,请你帮忙按规则生成拼接后的「新短语」列表。

「短语」(phrase)是仅由小写英文字母和空格组成的字符串。「短语」的开头和结尾都不会出现空格,「短语」中的空格不会连续出现。

「前后拼接」(Before and After puzzles)是合并两个「短语」形成「新短语」的方法。我们规定拼接时,第一个短语的最后一个单词 和 第二个短语的第一个单词 必须相同。

返回每两个「短语」 phrases[i] 和 phrases[j]i != j)进行「前后拼接」得到的「新短语」。

注意,两个「短语」拼接时的顺序也很重要,我们需要同时考虑这两个「短语」。另外,同一个「短语」可以多次参与拼接,但「新短语」不能再参与拼接。

请你按字典序排列并返回「新短语」列表,列表中的字符串应该是 不重复的 。

 

示例 1:

输入:phrases = ["writing code","code rocks"]
输出:["writing code rocks"]

示例 2:

输入:phrases = ["mission statement",
                "a quick bite to eat",
                "a chip off the old block",
                "chocolate bar",
                "mission impossible",
                "a man on a mission",
                "block party",
                "eat my words",
                "bar of soap"]
输出:["a chip off the old block party",
      "a man on a mission impossible",
      "a man on a mission statement",
      "a quick bite to eat my words",
      "chocolate bar of soap"]

示例 3:

输入:phrases = ["a","b","a"]
输出:["a"]

 

提示:

  • 1 <= phrases.length <= 100
  • 1 <= phrases[i].length <= 100

C++

class Solution {
public:
    vector<string> beforeAndAfterPuzzles(vector<string>& phrases) 
    {
        vector<string> res;
        int n=phrases.size();
        vector<pair<int,int>> tmp;
        for(int k=0;k<n;k++)
        {
            string str=phrases[k];
            int k1=-1;
            int k2=-1;
            for(int i=0;i<str.length();i++)
            {
                if(' '==str[i])
                {
                    k1=i;
                    break;
                }
            }
            for(int i=str.length()-1;i>=0;i--)
            {
                if(' '==str[i])
                {
                    k2=i;
                    break;
                }
            }
            tmp.push_back(make_pair(k1,k2));
        }
        set<string> st;
        for(int i=0;i<n;i++)
        {
            string end="";
            if(tmp[i].first!=-1)
            {
                end=phrases[i].substr(tmp[i].second+1);
            }
            else
            {
                end=phrases[i];
            }
            for(int j=0;j<n;j++)
            {
                if(j!=i)
                {
                    string start="";
                    if(tmp[j].first!=-1)
                    {
                        start=phrases[j].substr(0,tmp[j].first);
                    }
                    else
                    {
                        start=phrases[j];
                    }
                    if(start==end)
                    {
                        if(tmp[i].first==-1)
                        {
                            st.insert(phrases[j]);
                        }
                        else
                        {
                            string ss=phrases[i];
                            if(tmp[j].first!=-1)
                            {
                                ss+=phrases[j].substr(tmp[j].first);                                
                            }
                            st.insert(ss);
                        }
                    }                    
                }
            }
        }
        for(auto ss:st)
        {
            res.push_back(ss);
        }
        sort(res.begin(),res.end());
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值