Java hashfunction()的逻辑应该是什么,以检查两个字符串是否为字谜?
我想写一个函数,将字符串作为参数,并返回与该字符串对应的数字Java hashfunction()的逻辑应该是什么,以检查两个字符串是否为字谜?,java,hash,hashmap,anagram,Java,Hash,Hashmap,Anagram,我想写一个函数,将字符串作为参数,并返回与该字符串对应的数字 Integer hashfunction(String a) { //logic } 实际上,我要解决的问题如下: 给定一个字符串数组,返回所有为字谜的字符串组。用表示原始列表中索引的整数列表表示组 Input : cat dog god tca Output : [[1, 4], [2, 3]] 以下是我的实施: public class Solution { Integer hashfunct
Integer hashfunction(String a)
{
//logic
}
实际上,我要解决的问题如下:
给定一个字符串数组,返回所有为字谜的字符串组。用表示原始列表中索引的整数列表表示组
Input : cat dog god tca
Output : [[1, 4], [2, 3]]
以下是我的实施:
public class Solution {
Integer hashfunction(String a)
{
int i=0;int ans=0;
for(i=0;i<a.length();i++)
{
ans+=(int)(a.charAt(i));//Adding all ASCII values
}
return new Integer(ans);
}
**Obviously this approach is incorrect**
public ArrayList<ArrayList<Integer>> anagrams(final List<String> a) {
int i=0;
HashMap<String,Integer> hashtable=new HashMap<String,Integer>();
ArrayList<Integer> mylist=new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> answer=new ArrayList<ArrayList<Integer>>();
if(a.size()==1)
{
mylist.add(new Integer(1));
answer.add(mylist);
return answer;
}
int j=1;
for(i=0;i<a.size()-1;i++)
{
hashtable.put(a.get(i),hashfunction(a.get(i)));
for(j=i+1;j<a.size();j++)
{
if(hashtable.containsValue(hashfunction(a.get(j))))
{
mylist.add(new Integer(i+1));
mylist.add(new Integer(j+1));
answer.add(mylist);
mylist.clear();
}
}
}
return answer;
}
}
公共类解决方案{
整数哈希函数(字符串a)
{
int i=0;int ans=0;
对于(i=0;i,对于由相同字符组成的所有字符串,您需要一个相同的数字
String.hashCode
方法返回的数字对于由相同顺序的相同字符组成的所有字符串都是相同的
如果可以对所有单词进行一致的排序(例如:按字母顺序),则String.hashCode
将为所有字谜返回相同的数字
return String.valueOf(Arrays.sort(inputString.toCharArray())).hashCode();
注意:这将适用于所有字谜(无误报),但可能不适用于所有非字谜(可能误报)的单词。对于短单词来说,这是不太可能的,但一旦你找到数百个字符长的单词,你就会开始遇到多个具有相同哈希代码的字谜
另请注意:这将为您提供(的标题)的答案问题,但这还不足以解决你要解决的问题。你需要弄清楚如何将这个数字与原始列表中的索引关联起来。哦,天哪……这里有很多东西可以解释。区分大小写、区域设置、允许字符/黑名单……有很多方法可以回答这个问题问题。首先,让我提出一些假设:
Input : cat dog god tca
Output : [[1, 4], [2, 3]]
案例无关紧要。(“Rat”是“Tar”的一个字谜,即使大写。)
就字母表而言,Locale是美式英语。(A-Z中有26个字母。与西班牙语相比,西班牙语有28个IIRC,其中“ll”被认为是一个字母,可能是西班牙语拼字法的考虑因素!)
在我们对字谜的定义中,空白被忽略了。(“arthas menethil”是“头盔中的垃圾”的字谜,尽管空白的数量不同。)
空字符串(null、0长度、全空白)的“哈希”(我更喜欢术语“摘要”,但名称就是名称)为1
如果你不喜欢这些假设中的任何一个,你可以随心所欲地修改它们。当然,这会导致下面的算法略有不同,但它们是一套很好的指导原则,可以使通用算法相对容易理解,如果你愿意,可以进行重构
如果两个字符串完全由相同的字符集和包含的每个字符数组成,那么它们就是字谜。Java中有很多工具使这项任务相当简单。我们有字符串方法、列表、比较器、装箱原语和现有的hashCode方法……所有这些。我们将ng使用它们来创建我们的“哈希”方法
private static int hashString(字符串s){
如果(s==null)返回0;//空/null字符串将返回0。
List charList=new ArrayList();
String lowercase=s.toLowerCase();//这让我们了解了区分大小写的问题
for(int i=0;i
瞧,你有一个方法可以消化字符串并生成一个表示它的整数,而不考虑其中字符的顺序。你可以以此为基础来确定两个字符串是否是彼此的anagram…但我不会。你要求一个生成整数的摘要函数,但请记住,在java中n个整数只是一个32位的值。这个方法只能产生大约42亿个唯一的值,而且可以有超过42亿个字符串。这个方法会产生冲突,并给你无意义的结果。如果这是个问题,你可能会考虑使用BigToCipe代替。< /P>
private static BigInteger hashString(String s) {
BigInteger THIRTY_ONE = BigInteger.valueOf(31); // You should promote this to a class constant!
if (s == null) return BigInteger.ONE; // An empty/null string will return 1.
BigInteger r = BigInteger.ONE; // The value of r will be returned by this method
List<Character> charList = new ArrayList<>();
String lowercase = s.toLowerCase(); // This gets us around case sensitivity
for (int i = 0; i < lowercase.length(); i++) {
Character c = Character.valueOf(lowercase.charAt(i));
if (Character.isWhitespace(c)) continue; // spaces don't count
charList.add(c); // Note the character for future processing...
}
// Now we have a list of Characters... Sort it!
Collections.sort(charList);
// Calculate our bighash, similar to how java's List interface does.
for (Character c : charList) {
int charHash = c.hashCode();
r=r.multiply(THIRTY_ONE).add(BigInteger.valueOf(charHash));
}
return r;
}
私有静态BigInteger哈希字符串(字符串s){
BigInteger三十一=BigInteger.valueOf(31);//您应该将其提升为类常量!
if(s==null)返回biginger.ONE;//空/空字符串将返回1。
BigInteger r=BigInteger.ONE;//此方法将返回r的值
List charList=new ArrayList();
String lowercase=s.toLowerCase();//这让我们了解了区分大小写的问题
for(int i=0;i
这里有一个提示输出:[[1,4],[2,3]
不是整数