这是homework问题。
My String可以包含很多字符,我需要找出字符串中重复次数最多的字符。
Ex:str =“样本字符串包含aaaaaaaaaa#12”; 这里大多数重复的字符是'a'
我的代码:(算法)
- 初始化的2D数组,大小为127(ASCII)字符。 ARR [127] [2]
- 解析字符串,使用相应的值递增数组的ASCII索引。
醇>
> for(int i=0; i<str.length(); i++)
> arr[str.charAt(1)][1] += 1;
- 最后,遍历数组以找出arr [x] [1]
的最大值 醇>
这个问题,需要O(n)
来解决它。
当字符串大小非常大时,我正在寻找更好的性能。
谢谢!
答案 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值数组的最终阵列扫描。