我有以下数据结构和算法问题,我一直试图为更好的解决方案 -
鉴于
$ x是经度和 $ y是纬度
以及以下字符
'>' east $ x ++; '<' west $ x--; ' ^'北美$ ++; ' V'南$ y - ;
并将示例输入为字符串 " ^ V<>>< ^> V<> ^< ^> ^>> V>>< ^^<>><<&LT ;><<>< ^< ^ v氮化^^ v<<>><<<< ^> v ^> v ^ v ^<< >> v<>< ^<>><>> ^><> v ^ v> v<<> v<> v ^^>&LT ;<>>> v<<>>>> ^> v>>”中
编写一个识别所有闭环的函数(下面给出的一些样本是闭环的例子) [ “^ V” “<>”中, “><”, “^> V<”, ... ]
我已经能够在O(n ^ 2)中解决这个问题,方法是从给定的输入中挑选每个字符,然后遍历整个字符串并保留两个计数变量 - 一个用于垂直计数,另一个用于水平计数,在任何位置指出两者的值为零然后它是一个闭环。但我想知道是否有人可以更有效地做到这一点 - 也许我错过了一些算法。
谢谢&问候, Vaibhav的
答案 0 :(得分:1)
创建一个任意长度的位集,例如Ñ
定义一个散列函数,将一对x,y坐标映射到位集中的一个位。
从字符串的开头开始,将当前的x和y初始化为零。
对于每个字符,计算散列并检查位集中的相应位。如果设置了if,则使用当前算法检查当前字符是否有循环结束,向后工作。然后设置当前位置的位,根据字符调整x和y并移动到下一个字符。
bitset用作快速检查以查看循环是否可能以当前字符结尾,仅在设置位的情况下完成全面检查,以避免在散列冲突的情况下出现误报,并且找到循环的起始字符。它还允许您处理更多复杂的循环,这些循环不止一次地返回到相同的位置(例如,在十字架处开始和结束的图8循环),如果您想将它们分别计算到它们包含的较小循环。
答案 1 :(得分:1)
我建议围绕以下内容:
Map (X,Y) => N as visited;
for(int i=0; i<input_str.length; ++i){
! update (x,y) per input_str[i];
if(visited.has(x,y))
{
last_visit_index = visited[x,y];
loop = input_str.substring last_visit_index to i
}
visited[x,y] = i;
}
这是O(N)
。