【剑指offer】面试题:求字符串的所有组合
来源:互联网 发布:监控用网络光端机 编辑:程序博客网 时间:2024/05/24 07:10
题目
输入一个字符串,打印出该字符串中字符的所有组合。
例如输入三个字符a, b, c,则它们的组合有 a, b, c, ab, ac, bc, abc。
当交换字符串中的字符时,虽然能得到两个不同的排列,但却是同一个组合。比如 ab 和 ba 是不同的排列,但只算一个组合。
思路
如果输入n个字符,则这n个字符能构成长度为1, 2, …, n的组合。
求n个字符的长度为m(1≤m≤n)的组合的时候,
我们把这n个字符分成两个部分:第一个字符和其余的所有字符。
如果组合里包含第一个字符,则下一步在剩余的n-1个字符里选择m-1个字符;
如果组合里不包含第一个字符,则下一步在剩余的n-1个字符里选择m个字符。
可以用递归解决。
代码
/** * 题目: * 输入一个字符串,求字符串中字符的所有组合 * 例如输入字符串"abc",则它们的组合有a, b, c, ab, ac, bc, abc * 当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合。 * 比如 ab 和 ba 是不同的排列,但只算一个组合。 * * @author peige */public class _997_StringCombination { private StringBuilder sb; private Set<String> result; private int index; public ArrayList<String> stringCombination(String str) { if(str == null || str.trim().length() == 0) return new ArrayList<>(); char chars[] = str.toCharArray(); sb = new StringBuilder(); result = new TreeSet<>(); index = 0; for(int i = 1; i <= str.length(); ++i) { stringCombination(chars, i); } return new ArrayList<>(result); } private void stringCombination(char[] chars, int length) { if(length == 0) { result.add(sb.toString()); return; } if(chars.length - index < length) { return; } // 选择第一个,从剩下的中选择length-1个 sb.append(chars[index]); ++index; stringCombination(chars, length - 1); sb.deleteCharAt(sb.length() - 1); // 不选择第一个,从剩下的中选择length个 stringCombination(chars, length); --index; }}
测试
public class _997_Test { public static void main(String[] args) { test1(); test2(); test3(); } /** * 功能测试 */ private static void test1() { _997_StringCombination sc = new _997_StringCombination(); System.out.println(sc.stringCombination("abc")); System.out.println(sc.stringCombination("abcd")); System.out.println(sc.stringCombination("aabb")); } /** * 边界测试 */ private static void test2() { _997_StringCombination sc = new _997_StringCombination(); System.out.println(sc.stringCombination("a")); System.out.println(sc.stringCombination("aaa")); } /** * 极端测试 */ private static void test3() { _997_StringCombination sc = new _997_StringCombination(); System.out.println(sc.stringCombination("")); System.out.println(sc.stringCombination(null)); }}
阅读全文
0 0
- 【剑指offer】面试题:求字符串的所有组合
- 《剑指Offer》读书笔记---面试题28:字符串的排列,(扩展:求字符串的所有组合)
- 剑指Offer中面试题28的扩展问题(求字符的所有组合)
- 剑指Offer----面试题28----扩展:字符的所有组合
- 剑指offer面试题28字符串的所有排列permutation
- 剑指offer:求字符的所有组合
- [剑指offer]求字符的所有组合
- 《剑指Offer》:求字符串的组合
- Java面试题:输出字符串的所有组合
- 剑指offer面试题28扩展提————字符串的组合
- 《剑指Offer》面试题:字符串的组合(不用递归求解)
- 剑指offer面试题 字符串的排列
- 剑指offer 面试题28 字符串的排列与集合的所有子集
- 求字符串的所有组合
- 求字符串的所有组合
- 求字符串的所有组合
- 《剑指Offer》面试题:按字典序打印出该字符串中字符的所有排列
- 剑指Offer----面试题35:扩展----删除字符串中所有重复出现的字符 & 变位词
- 轻量级大规模机器学习算法库Fregata开源:快速,无需调参
- python socket send 函数 报错:TypeError: a bytes-like object is required, not 'str'
- TLS回调函数的使用
- Unity3D小白学习日记(02):U3D如何连接SQL SERVER数据库(亲测可行!)
- 下一代数据湖技术:Tachyon + Spark将极为重要
- 【剑指offer】面试题:求字符串的所有组合
- swift中tableview给cell添加左划菜单
- 2017.07.28工作日记
- 工厂模式-原型
- 盘点数据大牛公司
- 六路时钟输出
- android在.java中手写布局
- HelloWorld.c
- SpringBoot:spring boot文件上传【多文件上传】