import javamathBigInteger;
import javautil;
public class PermutationGenerator {
private int[] a;
private BigInteger numLeft;
private BigInteger total;
public PermutationGenerator(int n) {
if (n < 1) {
throw new IllegalArgumentException("Min 1");
}
a = new int[n];
total = getFactorial(n);
reset();
}
public void reset() {
for (int i = 0; i < alength; i++) {
a[i] = i;
}
numLeft = new BigInteger(totaltoString());
}
public BigInteger getNumLeft() {
return numLeft;
}
public BigInteger getTotal() {
return total;
}
public boolean hasMore() {
return numLeftcompareTo(BigIntegerZERO) == 1;
}
private static BigInteger getFactorial(int n) {
BigInteger fact = BigIntegerONE;
for (int i = n; i > 1; i--) {
fact = factmultiply(new BigInteger(IntegertoString(i)));
}
return fact;
}
public int[] getNext() {
if (numLeftequals(total)) {
numLeft = numLeftsubtract(BigIntegerONE);
return a;
}
int temp;
// Find largest index j with a[j] < a[j+1]
int j = alength - 2;
while (a[j] > a[j + 1]) {
j--;
}
// Find index k such that a[k] is smallest integer
// greater than a[j] to the right of a[j]
int k = alength - 1;
while (a[j] > a[k]) {
k--;
}
// Interchange a[j] and a[k]
temp = a[k];
a[k] = a[j];
a[j] = temp;
// Put tail end of permutation after jth position in increasing order
int r = alength - 1;
int s = j + 1;
while (r > s) {
temp = a[s];
a[s] = a[r];
a[r] = temp;
r--;
s++;
}
numLeft = numLeftsubtract(BigIntegerONE);
return a;
}
//程序测试入口
public static void main(String[] args) {
int[] indices;
String[] elements = { "a", "b", "c"};
PermutationGenerator x = new PermutationGenerator(elementslength);
StringBuffer permutation;
while (xhasMore())
{
permutation = new StringBuffer("%");
indices = xgetNext();
for (int i = 0; i < indiceslength; i++) {
permutationappend(elements[indices[i]])append("%");
}
Systemoutprintln(permutationtoString());
}
}
}
先给你一个看看!
组合命令:nchoosek,例子
nchoosek(1:5,3)%在[1
2
3
4
5]里取3个的全部组合
然后你可以对每一种组合(每一行)进行相应的计算即可
void nn(char c,char cc[])
{//对于有重复的数据这就不行了
//虽然可以都列出来,中间有重复的可能
char tmp,qc;
if(c=='#')printf("%s",cc);
else {
for(qc=c;qc!='#';qc++){
tmp=c;
c=qc;
qc=tmp;
cc++;
nn(qc,cc);
cc--;
tmp=c;
c=qc;
qc=tmp;
}
}
}
main()
{
char cc[100];//请以#结束
scanf("%s",&cc);
nn(cc,cc);
}
请先解释需求:
1、什么叫”按照英文句子里的单词顺序进行排序“,参照的是哪个单词?首单词?
2、排序的目标是什么?整条句子么?
3、什么叫”字母顺序相同“?所有字母升序或降序,还是说句子里所有单词首字母相同?
单纯字符串排序(整篇文章就是二维字符数组,一条句子就是一行字符串),用冒泡排序,嵌套循环比较(不满足你所谓的条件)就执行交换,假设两个句子交换位置,就是两个字符串交换,定义一个临时字符数组变量(够大),之后用strcpy函数和这个临时变量进行两个字符串的交换。(strcpy函数在这里相当于一般数值交换的等号)。
这个不过繁了些,不难。有具体疑问再问吧,tao_qiufeng@126com,有问题发邮件吧,我想主要利用if、while语句,如果你是初学,估计数组是你的难点,特别是动态的多维的数组。
#include<iostream>
using namespace std;
int main()
{
int i,a;
int counter=0;
for (i=0; i<3; ++i)
for (a=0; a<=14; ++a)
{
counter=counter+1;
cout<<"counter"<<counter<<" games"<<a<<" score"<<i<<endl;
}
cinget();
cinget();
}
//用DEV-C++
以上就是关于Java程序如何实现对字符串的排列组合问题全部的内容,包括:Java程序如何实现对字符串的排列组合问题、matlab 排列组合程序、c语言如何实现排列组合的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)