首页 > 试题广场 >

字符串组合

[编程题]字符串组合
  • 热度指数:5374 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入一个字符串,输出该字符串中相邻字符的所有组合。
举个例子,如果输入abc,它的组合有a、b、c、ab、bc、abc。(注意:输出的组合需要去重)(40分)

输入描述:
一个字符串


输出描述:
一行,每个组合以空格分隔,相同长度的组合需要以字典序排序,且去重。
示例1

输入

bac

输出

a b c ac ba bac

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            String str = sc.next();
            ArrayList<String> result = new ArrayList<String>();
            result = listOfString(str);
            for(String string: result) {
                System.out.print(string+" ");
            }
        }    
    }

    private static ArrayList<String> listOfString(String str) {
        ArrayList<String> list = new ArrayList<String>();
        Set<String> set = new TreeSet<String>();
        for(int i = 0; i < str.length(); i++) {
            set.add(String.valueOf(str.charAt(i)));
        }
        list.addAll(set);
        set.clear();
        for(int gap = 1; gap < str.length(); gap++) {
            for(int i = 0; i < str.length(); i++) {
                if(i + gap < str.length()) {
                    set.add(str.substring(i, i + gap + 1));
                }
                else {
                    list.addAll(set);
                    set.clear();
                    break;
                }
            }
        }
        return list;
    }    
}


编辑于 2019-04-24 14:47:26 回复(0)
//TreeSet  既能够排序又能去重!
import java.util.Comparator;
import java.util.Scanner; import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        TreeSet<String> set = new TreeSet<>(new StringLengthComparator());
        for (int i = 0; i < str.length(); i++) {
            for (int j = i + 1; j <= str.length(); j++) {
                set.add(str.substring(i, j));
            }
        }
        for (String i : set) {
            System.out.print(i+" ");
        }
    }
}

// 定义比较器
class StringLengthComparator implements Comparator<Object> { @Override public int compare(Object o1, Object o2) {
        String s1 = (String) o1;
        String s2 = (String) o2;
        int result = 0;
        if (s1.length() > s2.length()) {
            result = 1;
        } else if (s1.length() < s2.length()) {
            result = -1;
        } else {
            result = s1.compareTo(s2);
        }
        return result;
}
编辑于 2018-02-10 22:33:27 回复(0)

随便写的,还可以优化,轻喷

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        //如果输入长度为1,直接打出字符串
        if (input.length() <= 1) {
            System.out.println(input);
        }
        List<String> tempList = new ArrayList<>();
        for (int i = 0; i < input.length(); i++) {
            for (int j = i; j < input.length(); j++) {
                String frontStr = input.substring(i, j + 1);
                if (!tempList.contains(frontStr)) {
                    tempList.add(frontStr);
                }
            }
        }
        Collections.sort(tempList, (o1, o2) -> o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length());
        tempList.stream().forEach(s -> System.out.print(s + " "));
    }
}
发表于 2018-01-31 23:43:50 回复(0)

在Subset的基础上进行 了一些小小的改动。

  1. 子串必须是相邻字符的组合,这点其实非常简单,直接利用 contains 方法判断即可。

  2. 输出组合必须去重,最初我想到的是利用Set来实现,但是其实也能通过List的contains方法来解决。

  3. 子串必须按照长度顺序排列,若长度相同则按照字典顺序排列。这个写一个比较器就能够 解决了。

详细代码如下:

(PS.写得非常直白,仅做一个抛砖引玉的作用~有更好的解法欢迎分享o(^▽^)o)

关于Subset这道题目可以在LintCode/LeetCode上找到,同样的解法和解释可以参见:

https://github.com/cherryljr/LintCode/blob/master/Subsets%20II.java

欢迎大家follow我( ▼-▼ )

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        if (str.length() <= 1) {
            System.out.println(str);
        }
        List rst = new ArrayList();
        helper(rst, new StringBuilder(), 0, str);
        Collections.sort(rst, (a, b) -> a.length() == b.length()
                ? a.compareTo(b) : a.length() - b.length());
        for (int i = 0; i < rst.size(); i++) {
            System.out.print(rst.get(i) + " ");
        }
    }
    public static void helper(List rst, StringBuilder sb, int start, String str) {
        if (rst.contains(sb.toString())) {
            return;
        }
        if (sb.length() == 1) {
            rst.add(sb.toString());
        } else if (sb.length() > 1 && str.contains(sb.toString())) {
            rst.add(sb.toString());
        }
        for (int i = start; i < str.length(); i++) {
            sb.append(str.charAt(i));
            helper(rst, sb, i + 1, str);
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}
编辑于 2018-01-06 15:53:26 回复(1)