有一道华为上机题,求解啊

我是一只好羊 2015-12-16 07:33:15
加精
有一个字符串,根据输入参数m,找出字符串的m个字符的所有字符串

例如
String str ="abc", m=2 得到结果是 "ab" "ac" "bc"
String str ="abcd" , m=3 得到结果是"abc" "acd" "bcd" "abd"

求解啊,谢谢
...全文
5226 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jeff.xie 2016-08-01
  • 打赏
  • 举报
回复
这个不是,C几取几的算法么? “abc” m = 2, 就是C 3 取 2 == 3; “abcd” m = 3, 就是C 4 取 3 == 4;
MOMI_CAFE 2016-03-02
  • 打赏
  • 举报
回复
chen222246lei 2016-03-02
  • 打赏
  • 举报
回复
请问楼主,如果给定字符串是bdca,n=3,那么输出应该是什么?
a9805943 2016-02-23
  • 打赏
  • 举报
回复
高中概率题。。。。。。。
KobeAndLebron 2015-12-22
  • 打赏
  • 举报
回复

/**
	 * 
	 * @param str 即将要搜寻的字符串
	 * @param arrayList 存储选中的字符
	 * @param index 选到第几个字符了 0~str.length-1
	 * @param remain  还有多少个字符要被搜寻
	 */
	public static void find(String str , ArrayList<Character> arrayList , int index , int remain){
		if(index <= str.length() - 1 && remain > 0){
			// 这个字符被选中
			arrayList.add(str.charAt(index));
			find(str, arrayList, index + 1, remain - 1);
			arrayList.remove(new Character(str.charAt(index)));
			
			// 这个字符没有被选中
			find(str, arrayList, index + 1, remain);
		}else{
			// 如果已经选了sum个字符则输出
			if(remain == 0){
				System.out.println(arrayList.toString());
			}
		}
	}

       public static void main(String[] args) {
		String str = "abc";
		find(str, new ArrayList<Character>(), 0, 2);
	}


风马博客 2015-12-22
  • 打赏
  • 举报
回复
唉,可怜我套了两层循环,没写出来,学习了
land_xiao 2015-12-22
  • 打赏
  • 举报
回复
public class SonString {

	public static void main(String[] args) {
	
		String s="abcdef";
		int n = 2;
		int [] a = new int[n];
		char[] b = s.toCharArray();
		for(int k=0; k<n;k++) {
			a[k] = k+1;
		}
		int m=s.length(),  i, position;
	    for(i=0; i<n; i++){
	    	System.out.print(b[a[i]-1]);
	    }
	    System.out.println();
	    boolean flag = true;
	    position = n-1;  
	    while(flag) {
	
		    if(a[n-1]==m)
		    	position--;
		    else
		    	position=n-1;
		    	a[position]++;
		    for(i=position+1; i<n; i++)
		    	a[i]=a[i-1]+1;
		    for(i=0; i<n; i++)
		    	System.out.print(b[a[i]-1]);
		    System.out.println();
		    if(a[0]>=m-n+1)
		    	flag = false;
	    }    
	}
}
利用下标组合来找字串
笨笨的_ 2015-12-22
  • 打赏
  • 举报
回复
学习了,自己居然没写得出来。。。。
song195617 2015-12-21
  • 打赏
  • 举报
回复
楼上正解。。
jliang981 2015-12-19
  • 打赏
  • 举报
回复
引用 16 楼 qq_16546953 的回复:
5楼直接运用了递归 去做,比我用 分治法去做 更加 简单,不错。 再稍微简化下 5楼的 代码 ,让 递归 思路 更加 清晰:

public static List<String> choose(String target, int m) {
	List<String> resultList = new LinkedList<>();
	doChoose(resultList, target, "", m, 0);
	return resultList;
}

private static void doChoose(List<String> resultList, String target, String resultStr, int m, int head) {

	// 递归头
	if (resultStr.length() == m) {
		resultList.add(resultStr);
		return;
	}

	// 递归体
	for (int i = head; i < target.length(); i++) {
		doChoose(resultList, target, resultStr + target.charAt(i), m, i+1);
	}
}
代码很简洁,谢谢分享
Ric_Wu 2015-12-18
  • 打赏
  • 举报
回复
之前一直在找这个,学习了
  • 打赏
  • 举报
回复
看到这个题目就感觉好像在哪里看过一样 leetcode.com里面的 Letter Combinations of a Phone Number 楼主可以去看一下
wgtamg 2015-12-17
  • 打赏
  • 举报
回复
楼上用set集合输出好一点,可以去除重复组合。比如”hello“中取2个。会有两个hl,el这样的。顺便吐槽验证码
qq_33409410 2015-12-17
  • 打赏
  • 举报
回复
按照你这个,你算一下楼主给的例子,String str ="abc", m=2,看一下结果是楼主给的结果吗??? 看楼主给的例子,明显是 组合问题,每个组合结果的内部是不涉及排列的。
梵高先生2015 2015-12-17
  • 打赏
  • 举报
回复
引用 4 楼 Itsjd 的回复:
[quote=引用 1 楼 qq_16546953 的回复:]

/**
 * 分治思想
 * 
 * @param target
 * @param num
 * @return
 */
public static List<String> choose(String target, int num) {

	List<String> resultList = new LinkedList<>();

	if (num > target.length()) {
		return resultList;
	}
	if (num == target.length()) {
		resultList.add(target);
		return resultList;
	}
	// 将target均分(0 ~ bound - 1与bound ~ end)
	int bound = target.length() / 2;
	String left = target.substring(0, bound);
	String right = target.substring(bound, target.length());
	// 要选择的num个元素可能全部来自left
	resultList.addAll(choose(left, num));
	// 可能全部来自right
	resultList.addAll(choose(right, num));
	// 可能两边都有,这时对num做划分:num = l + r(l表示来自left的元素的个数,r表示来自right的元素的个数)
	for (int l = 1; l < num; l++) {
		int r = num - l;
		// 从left中挑选l个元素
		List<String> fromLeftList = choose(left, l);
		// 从right中挑选r个元素
		List<String> fromRightList = choose(right, r);
		// 组合起来
		for (String fromLeft : fromLeftList) {
			for (String fromRight : fromRightList) {
				// 添加到结果集里面
				resultList.add(fromLeft + fromRight);
			}
		}
	}
	return resultList;
}
如果是abc,3的话应该返回的abc,acb,bca,bac,cab,cba这样的 个人理解[/quote] 按照你这个,你算一下楼主给的例子,String str ="abc", m=2,看一下结果是楼主给的结果吗??? 看楼主给的例子,明显是 组合问题,每个组合结果的内部是不涉及排列的。
nainai5201314 2015-12-17
  • 打赏
  • 举报
回复
楼上正解,菜鸟来学习啦
meijun9869 2015-12-17
  • 打赏
  • 举报
回复
很不错,谢谢分享
meijun880205 2015-12-17
  • 打赏
  • 举报
回复
楼上正解,菜鸟来学习啦
ITjavaman 2015-12-17
  • 打赏
  • 举报
回复
	public static void main(String[] args){
		int n = 3;
		String str ="abcd";
		String result = "";
		subselect(0, 1, result,str, n); 
    }
	private static void subselect(int head, int length,String result, String str,int n) { 
		String s =result;
		for (int i = head; i < str.length() + length - n; i++) {
			    if (length < n) { 
			    	result = result+str.substring(i,i+1); 
			    	subselect(i + 1, length + 1, result,str, n);
			    } else if (length == n) { 
			    	result = result+str.substring(i,i+1); 
			    	subselect(i + 1, length + 1, result,str, n);
			    	System.out.println(result);
			    } else { 
			    	return;
			    }
			    result =s;
		}
	}
DY1201 2015-12-17
  • 打赏
  • 举报
回复
引用 1 楼 qq_16546953 的回复:

/**
* 分治思想
*
* @param target
* @param num
* @return
*/
public static List<String> choose(String target, int num) {

List<String> resultList = new LinkedList<>();

if (num > target.length()) {
return resultList;
}
if (num == target.length()) {
resultList.add(target);
return resultList;
}
// 将target均分(0 ~ bound - 1与bound ~ end)
int bound = target.length() / 2;
String left = target.substring(0, bound);
String right = target.substring(bound, target.length());
// 要选择的num个元素可能全部来自left
resultList.addAll(choose(left, num));
// 可能全部来自right
resultList.addAll(choose(right, num));
// 可能两边都有,这时对num做划分:num = l + r(l表示来自left的元素的个数,r表示来自right的元素的个数)
for (int l = 1; l < num; l++) {
int r = num - l;
// 从left中挑选l个元素
List<String> fromLeftList = choose(left, l);
// 从right中挑选r个元素
List<String> fromRightList = choose(right, r);
// 组合起来
for (String fromLeft : fromLeftList) {
for (String fromRight : fromRightList) {
// 添加到结果集里面
resultList.add(fromLeft + fromRight);
}
}
}
return resultList;
}
如果是abc,3的话应该返回的abc,acb,bca,bac,cab,cba这样的
个人理解
加载更多回复(16)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧