解题思路

这是一个字符串组合问题,需要找出所有相邻字符的组合。关键是要理解"相邻"的含义,并注意去重和排序要求。

关键点:

  1. 只能组合相邻的字符
  2. 需要按照长度和字典序排序
  3. 需要去重
  4. 输出时用空格分隔

算法步骤:

  1. 获取所有可能长度的子串
  2. 对每个长度的子串进行去重和排序
  3. 按长度和字典序输出结果

代码

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    string solve(string s) {
        // 使用set自动去重
        set<string> combinations;
        int n = s.length();
        
        // 枚举所有可能的长度
        for (int length = 1; length <= n; length++) {
            // 获取所有长度为length的子串
            for (int start = 0; start <= n - length; start++) {
                combinations.insert(s.substr(start, length));
            }
        }
        
        // 按长度排序
        vector<string> result;
        map<int, vector<string>> lengthMap;
        
        for (const string& str : combinations) {
            lengthMap[str.length()].push_back(str);
        }
        
        // 构建结果字符串
        string answer;
        for (const auto& pair : lengthMap) {
            for (const string& str : pair.second) {
                if (!answer.empty()) answer += " ";
                answer += str;
            }
        }
        
        return answer;
    }
};

int main() {
    string s;
    getline(cin, s);
    
    Solution solution;
    cout << solution.solve(s) << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    public String solve(String s) {
        // 使用TreeSet自动去重和排序
        Set<String> combinations = new TreeSet<>((a, b) -> {
            if (a.length() != b.length()) {
                return a.length() - b.length();
            }
            return a.compareTo(b);
        });
        
        int n = s.length();
        // 枚举所有可能的长度
        for (int length = 1; length <= n; length++) {
            // 获取所有长度为length的子串
            for (int start = 0; start <= n - length; start++) {
                combinations.add(s.substring(start, start + length));
            }
        }
        
        return String.join(" ", combinations);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine().trim();
        
        Main solution = new Main();
        System.out.println(solution.solve(s));
        
        sc.close();
    }
}
``` []
def solve(s: str) -> str:
    # 存储所有长度的组合
    combinations = set()
    n = len(s)
    
    # 枚举所有可能的长度
    for length in range(1, n + 1):
        # 获取所有长度为length的子串
        for start in range(n - length + 1):
            combinations.add(s[start:start + length])
    
    # 按长度和字典序排序
    result = sorted(list(combinations), key=lambda x: (len(x), x))
    
    return ' '.join(result)

# 读取输入
s = input().strip()
print(solve(s))

算法及复杂度

时间复杂度

  • 生成所有子串:,其中 是字符串长度
  • 排序:,因为最多有 个子串
  • 总时间复杂度:

空间复杂度

  • 存储所有子串:
  • 总空间复杂度: