Hackerrank:Sherlock 和 Anagrams [关闭]

Posted

技术标签:

【中文标题】Hackerrank:Sherlock 和 Anagrams [关闭]【英文标题】:Hackerrank: Sherlock and Anagrams [closed] 【发布时间】:2020-07-19 16:39:33 【问题描述】:

问题描述:https://www.hackerrank.com/challenges/sherlock-and-anagrams

添加问题陈述的快照:

我只得到了几个正确的测试用例。我的算法是:

    查找给定字符串的所有子字符串。 使用每个字母的数组为每个子字符串创建代码。 将该代码转换为字符串并使用哈希映射映射该字符串。 如果子字符串的映射值包含非零值,则增加结果。

我的代码:

 static int sherlockAndAnagrams(String s) 
 HashMap<String,Integer> map = new HashMap<String,Integer>();
 int d,i,k=0;
 int length = s.length();
 int n = length*(length+1)/2;
 String []sub = new String[n]; 
 for (d = 0; d < length; d++)
     for(i = d+1; i <= length; i++)
      
        sub[k++] = s.substring(d, i);
      
  
int []c = new int[26];

  int result=0;;
for(int l=0;l<n;l++)
    for(int m=0;m<25;m++)
    c[m] = 0;
    
   char []suba = sub[l].toCharArray();  
  for(char ch : suba)
      c[ch-'a']+=1;
  
  String temp = Arrays.toString(c);
  Integer x = map.get(temp);
  if(x!=null)
      result = result+x;
    map.put(temp,++x);
  else
  map.put(temp,1);
   
  
  return result;

【问题讨论】:

请不要包含文字会更好的图片。解释问题和示例文本。 @NomadMaker 实际上我包含了初始图片,否则我们将不得不进行大量格式化。 @ankit715 你必须计算对而不是有多少碰撞。另外,map.put(...,x++) 应该是 map.put(...,++x); @vivek_23 “大量格式化”不是包含图片的借口。规则是能写就写。 @vivek_23 是的,它成功了!但仍然有 7 个测试用例中有 2 个失败。 【参考方案1】:

好的,这里有几件事。

您必须计算对,而不是有多少碰撞。

所以,应该是result = result + x;

另外,map.put(...,x++) 应该是 map.put(...,++x);,因为我们将使用预先增加的值进行更新。

另外,c 的填写从 024 但应该是 025。就这一点而言,最好只使用Arrays.fill(c,0)


为了节省空间,我们可以完全避免将每个子数组都放在一个数组中,而只是根据字符对子数组进行排序。这样,每个字谜将映射到映射中的相同键,帮助您避免将每个数组显式存储在 sub 字符串数组中。但是,整体空间复杂度将保持不变。

【讨论】:

请详细说明“根据字符对子数组进行排序”。 @ankit715 比如说你有 2 个子字符串 eattea。如果按字符排序,则两者都有aetaet,表明它们都是字谜 @nice_dev 第 4 点,c 的填充应该是 0 到 26 而不是 0 到 25,否则 Arrays.fill(c,0) 也可以。 @jack_07 我的意思是

以上是关于Hackerrank:Sherlock 和 Anagrams [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp Sherlock和费用

在查找c ++范围内的完美正方形时由于超时错误而终止

Actionbar Sherlock:设置和隐藏标题栏

Dalsa Sherlock 直连千兆网相机(通用驱动)

ActionBar Sherlock ,操作栏选项卡和片段

带有标签的 Android 操作栏 Sherlock