performance - 使用Java进行字符串操作以获得最多重复的char

时间:2012-03-07 04:11:30

标签: java string performance notation

这是问题。

My String可以包含很多字符,我需要找出字符串中重复次数最多的字符。

  

Ex:str =“样本字符串包含aaaaaaaaaa#12”;   这里大多数重复的字符是'a'

我的代码:(算法)

  
      
  1. 初始化的2D数组,大小为127(ASCII)字符。 ARR [127] [2]
  2.   
  3. 解析字符串,使用相应的值递增数组的ASCII索引。
  4.   
>        for(int i=0; i<str.length(); i++)
>           arr[str.charAt(1)][1] += 1;
  
      
  1. 最后,遍历数组以找出arr [x] [1]
  2. 的最大值   

这个问题,需要O(n)来解决它。

当字符串大小非常大时,我正在寻找更好的性能。

谢谢!

3 个答案:

答案 0 :(得分:2)

我可以想象像Boyers-Moore这样的算法用于字符串匹配。你已经确定了重复的 n 字符序列,然后检查从位置 i 开始的序列是否更长,那么你只需要检查位置 i + n 以查看它是否与位置 i 中的字符相同。如果不是,那么你开始检查位置 i + 1 ;如果是,那么你开始循环这两个点之间的字符,看看它们是否完全相同。如果你这样做,你最终可以跳过很多字符串。最糟糕的是,它仍然是O(n),因为它必须如此,但最好的情况是你可以跳过很多。

就空间要求而言:只需跟踪最长的跑步长度和角色(或起始位置)。您不需要二维阵列。

答案 1 :(得分:1)

我不认为你可以获得更好的TIMED效率,因为除了检查每个角色(我能想到的)之外别无他法,但你可以通过使用任何基于列表的数据结构来获得更好的STORAGE效率允许您动态创建新节点。这样,每次看到列表中尚未存在的字符时,您只需向列表中添加一个新元素,或者只增加列表中已有元素的数量。您可能不需要127个唯一字符。

答案 2 :(得分:0)

您可以使用相同的方法在O(n)时间内执行此操作,除非每次更新值检查它是否大于当前最大值。如果将其设置为新的最大值并继续。当你完成后,当前最大值将是最大值(你可以存储索引或者某种方式,你可以在最后打印出角色)。

在你的情况下,你在O(n)中扫描字符串,但是你在最后扫描数组,如果你这样做,你可以减轻你拥有的ASCII值数组的最终阵列扫描。