LeetCode 1181. 前后拼接(哈希map)

文章目录

1. 题目

给你一个「短语」列表 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/before-and-after-puzzle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class Solution {
public:
    vector<string> beforeAndAfterPuzzles(vector<string>& phrases) {
    	unordered_map<string,vector<int>> front;//字符前缀,包含该字符的字符串的idx
    	unordered_map<string,vector<int>> back;//字符后缀,包含该字符的字符串的idx
    	size_t idx1, idx2, len, i, j;
    	for(i=0; i<phrases.size(); ++i)
    	{
    		idx1 = phrases[i].find_first_of(' ');//第一个空格
    		idx2 = phrases[i].find_last_of(' ');//最后一个空格
    		if(idx1 != string::npos)//找到了
    			front[phrases[i].substr(0,idx1)].push_back(i);
    		else//没找到
    			front[phrases[i]].push_back(i);
    		if(idx2 != string::npos)
    			back[phrases[i].substr(idx2+1)].push_back(i);
    		else
    			back[phrases[i]].push_back(i);
    	}
    	set<string> ans;
    	for(auto it1 = back.begin(); it1 != back.end(); ++it1)
    	{
    		if(!front.count(it1->first))//前缀不包含该单词
    			continue;
    		len = it1->first.size();//包含,该代词的长度
			for(i = 0; i < it1->second.size(); i++)
			{
				idx1 = it1->second[i];//包含该后缀的单词idx
				for(j = 0; j < front[it1->first].size(); j++)
				{
					idx2 = front[it1->first][j];//包含该前缀的单词idx
					if(idx1 == idx2)
						continue;//同一个单词
					ans.insert(phrases[idx1]+phrases[idx2].substr(len));
				}
			}
    	}
    	return vector<string>(ans.begin(), ans.end());
    }
};

12 ms 10.3 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/107790829
今日推荐