leetcode
leetcode 1001 ~ 1050
前后拼接

前后拼接

难度:

标签:

题目描述

代码结果

运行时间: 35 ms, 内存: 16.1 MB


/*
 * LeetCode 1181 - Before and After Puzzle
 * Given a list of phrases, we need to return the list of all combinations of phrases where the last word of the first phrase matches the first word of the second phrase.
 * The result should be sorted and duplicates should be removed.
 */
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SolutionStream {
    public List<String> beforeAndAfterPuzzles(String[] phrases) {
        return IntStream.range(0, phrases.length)
            .boxed()
            .flatMap(i -> IntStream.range(0, phrases.length)
                .filter(j -> i != j)
                .filter(j -> phrases[i].split(" ")[phrases[i].split(" ").length - 1].equals(phrases[j].split(" ")[0]))
                .mapToObj(j -> phrases[i] + phrases[j].substring(phrases[j].split(" ")[0].length())))
            .collect(Collectors.toSet())
            .stream()
            .sorted()
            .collect(Collectors.toList());
    }
}

解释

方法:

该题解的思路是使用两个字典来分别存储每个短语的前缀和后缀。然后,检查所有前缀和后缀是否有相同的部分,如果有,则将对应的短语拼接在一起。最后,返回排序后的结果集。

时间复杂度:

O(n^2m)

空间复杂度:

O(n^2m)

代码细节讲解

🦆
为什么选择使用两个字典来存储每个短语的前缀和后缀,而不是采用其他数据结构如数组或哈希表?
在这个问题中,字典(即哈希表)被用来高效地存储和查询前缀和后缀。使用字典可以快速匹配相同的前缀或后缀,因为字典提供平均常数时间复杂度的查找性能。如果使用数组,则需要遍历数组来查找匹配项,这会导致更高的时间复杂度。此外,由于每个前缀和后缀可以对应多个短语,使用字典存储索引列表(即短语的位置)是管理这种多对多关系的有效方式。
🦆
在处理前缀和后缀时,如何保证短语中的空格被正确处理,特别是对于包含多个空格或无空格的短语?
在代码中,前缀是通过寻找第一个空格(如果存在)来确定的,后缀则是通过寻找最后一个空格来确定的。如果短语中没有空格(即`j`或`k`为-1),则整个短语既是前缀也是后缀。这种方法自然处理了包含多个空格或无空格的短语,确保前缀和后缀总是根据短语的实际结构被正确地切割。
🦆
在找到相同的前缀和后缀后,为什么可以直接将两个短语拼接,而不需要考虑其他可能的字符串重叠或冲突?
在算法中,只有当短语A的后缀与短语B的前缀完全相同时才会进行拼接,这确保了拼接的正确性和无缝性。因为这种情况下,两个短语在拼接点共享相同的单词,从而自然避免了重叠或冲突问题。此外,拼接后的字符串从短语A的开始到短语B的结束,中间的共享单词不会重复。
🦆
该算法中`if s != p`的条件是为了避免什么问题?会不会有因此漏掉某些有效组合的情况?
条件`if s != p`确保不会将同一短语与自身拼接,避免产生无意义的结果如重复相同短语。此条件只是为了确保短语的索引不相等,从而防止自我拼接。这不会漏掉任何有效的拼接组合,因为有效的组合需要两个不同的短语通过共享的前缀/后缀来进行拼接。

相关问题