在标记副本之前,请阅读:
我知道之前在stackoverflow上已经问过这个问题。我的 目的是知道我在实施同样的错误的地方 逻辑。我在最后一部分解释了我的逻辑。我也被问到了 关于codereview.stackexchange的这个问题,但我没有得到任何问题 响应。我已经尝试了很多来找到错误,但无法提出 什么都有。
Given a string, find its rank among all its permutations sorted
lexicographically. For example, rank of “abc” is 1, rank of “acb” is
2, and rank of “cba” is 6. Assuming there can be duplicate characters.
mycode的:
public class Solution {
public int findRank(String A) {
int n = A.length();
long rank = 0;
HashMap<Character,Integer> hm = new HashMap<Character,Integer>();
for (int i = 0; i < n-1; i++) {
int x=0;
int repFact=0;
hm.clear();
//find number of permutations placing character smaller than A[i]
at ith position , we call it 'x'
for (int j = i+1; j<n ; j++) {
if (A.charAt(i) > A.charAt(j)){
x++;
//put all the frequency of repeating characters in a Map
if(hm.containsKey((Character)A.charAt(j))){
hm.put((Character)A.charAt(j),hm.get((Character)A.charAt(j))+1);
}
else
hm.put((Character)A.charAt(j),1);
}
}
//Mod 1000003 to keep the number smaller
rank = (rank + x*((fact(n-i-1))))%1000003;
System.out.println("Rank = "+rank);
repFact =1;
if(!hm.isEmpty()){
Iterator it = hm.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
repFact =(repFact * fact((int)pair.getValue()))%1000003;
it.remove(); //to avoid concurrentModificationException
}
}
//permutation with repetation formula concept
rank = rank/repFact;
}
return (int)rank+1;
}
public static int fact(int n){
int fact =1;
while(n>0){
fact=(fact*n)%1000003;
n--;
}
return fact;
}
}
逻辑很简单: 从第一个字符开始,遍历到结束。找到在此之前排名的字符数,假设这是x,现在我们知道有x *(n-1)!排列排名高于此。 对字符串中的每个字符重复此过程。
要处理重复的字符,找到所有较小的字符(此时也包括相同的字符),执行与上面相同的操作,但是,这次除以由p形成的等级!其中p是重复字符的出现次数。
现在对于一个字符串bbbbaaaa,预期输出为70,但上面的代码是打印6.现在我无法在代码中找到循环漏洞,因为逻辑及其实现对我来说似乎很好。 任何人都可以提供一些有用的见解,了解它出了什么问题。