高效的perl或python算法
采访者在一次采访中问了一个问题,快速写了一个问题.以下功能的有效算法,
问题:编写一个函数来解析给定的字符串以获得以下给定的规则&生成最终解析的字符串作为输出 写一个接受字符串作为输入的函数,字符串长度将在[0..2000000000]之间
转型规则: 1)’AB’ – > ‘AA’ 每次在给定字符串上随机应用以上6条规则,并将最终转换后的字符串作为输出 例如,对Function的输入是:’ABCAAB’字符串 ABCAAB – > AACAAB [AB = AA] 最终结果:’A’ 因为我们现在无法对字符串应用任何其他规则. 我的答案就像(伪代码): sub myFunc { my $str = @_; flag = 1 while(flag ==1) { if ($str =~ /AB/){ $str =~ s/AB/AA/; next; } elsif($str =~ /AC/){ $str =~ s/AC/AA/; next; } elsif($str =~ /AA/){ $str =~ s/AA/A/; next; } elsif($str =~ /CC/){ $str =~ s/CC/C/; next; } elsif($str =~ /BC/){ $str =~ s/BC/BB/; next; } elsif($str =~ /BB/){ $str =~ s/BB/B/; next; } else { flag = 0 } } //while return $str; } //func 有人可以建议更好的算法&处理上述问题? 解决方法
规则1到3将丢弃A之后的任何字符.
规则5和6将丢弃B之后的任何B和C. 规则4将丢弃C之后的任何C.取代的顺序无关紧要. 因此在处理之后,字符串将是C,CB,CA,CBA,B,BA,A之一. 单次扫描字符串就足够了.如果你看到C,请保留它并跳过下一个C;然后,如果你看到B,保留它并跳过下一个B;然后,如果你看到A保持并停止. 给出的例子ABCAAB立即产生A. 明确应用规则和多次通过的解决方案是不可接受的,因为它们的行为可以是O(N2)或甚至是O(N3),而N = 2000000000. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |