向后关系


10

编写一个程序或函数,给定两个ASCII字符串AB,它们将产生字符串,A'并且B'在公共子字符串的位置将其反转。查找过程A'如下:

  1. A' 最初是空的。
  2. 如果的第一个字符A位于中B,则找到的最长前缀A是的子字符串B。从中删除此前缀A,并将其反转添加到中A'
  3. 否则,从中删除该第一个字符A并将其添加到中A'
  4. 重复步骤2-3,直到A为空。

查找B'的方法与此类似。

让我们考虑一下字符串A = "abc bab"B = "abdabc"。对于A',会发生以下情况:

  • A = "abc bab":第一个字符"a"在B中,而A的最长前缀在B中发现"abc"。我们从A删除此前缀,并将其反转添加"cba"到A'。
  • A = " bab":第一个字符" "不在B中,因此我们从A中删除了该字符并将其添加到A'中。
  • A = "bab":第一个字符"b"在B中,并且在B中找到的A的最长前缀是"b"。我们从A删除该前缀,并将其反转(仍为"b")添加到A'。
  • A = "ab":第一个字符"a"在B中,而A的最长前缀在B中发现"ab"。我们从A删除此前缀,并将其反转添加"ba"到A'。
  • A = "":A为空,因此我们停止。

这样我们得到A' = "cba" + " " + "b" + "ba" = "cba bba"。对于B',过程类似:

B = "abdabc"  ->  "a" in A, remove prefix "ab"
B = "dabc"    ->  "d" not in A, remove "d"
B = "abc"     ->  "a" in A, remove prefix "abc"

这样我们得到B' = "ba" + "d" + "cba" = "badcba"

最后,我们返回两个字符串,即

(A', B') = ("cba bba", "badcba")

测试用例

"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"

以字节为单位的最短代码获胜。


我们是否假定所有输入均为小写ASCII?确切的输出是否期望类似于"cba bba", "badcba"引号和逗号?
AdmBorkBork 2015年

@TimmyD确切的输入/输出格式是您的选择。您可能不会假定输入的是小写ASCII码-它可以是任何可打印的ASCII码。
orlp

空字符串是否合法输入?
MtnViewMark 2015年

@MtnViewMark是的。
orlp

Answers:



2

Haskell中,120个 111字节

import Data.List
a&b=(a#b,b#a)
[]#_=[]
(a:y)#b=[a]%y where p%(i:w)|reverse(i:p)`isInfixOf`b=(i:p)%w;p%x=p++x#b

测试运行:

λ: "abc bab"&"abdabc"
("cba bba","badcba")

λ: "abcde"&"abcd bcde"
("dcbae","dcba edcb")

λ: "hello test"&"test banana"
("hello tset","tset banana")

λ: "birds flying high"&"whistling high nerds"
("bisdr flyhgih gni","wihstlhgih gni nesdr")

1

SWI-Prolog,312字节

a(A,B,X,Y):-b(A,B,"",X),b(B,A,"",Y).
b(A,B,R,Z):-A="",R=Z;sub_string(A,0,1,_,C),(sub_string(B,_,1,_,C),(string_length(A,J),I is J-1,between(0,I,K),L is J-K,sub_string(A,0,L,_,S),sub_string(B,_,L,_,S),string_codes(S,E),reverse(E,F),string_codes(Y,F));S=C,Y=C),string_concat(S,V,A),string_concat(R,Y,X),b(V,B,X,Z).

示例:a("birds flying high","whistling high nerds",X,Y).输出

X = "bisdr flyhgih gni",
Y = "wihstlhgih gni nesdr" .

从某种意义上说,太长的解决方案,云怎么过详细展示是序言处理字符串的时候。可以使用代码数组(`birds flying high`)而不是字符串("birds flying high")来简化此操作。


1

Python 2.7, 169 156 152 141字节

m=lambda A,B:(b(A,B),b(B,A))
def b(A,B,C=''):
 while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
 return C

该函数m以2个字符串作为输入b,它两次调用函数,根据规范进行实际处理。
演示在这里
测试-

l=[("abc bab", "abdabc"),
("abcde", "abcd bcde"),
("hello test", "test banana"),
("birds flying high", "whistling high nerds")]
for e in l:
    print m(*e)

输出:

('cba bba', 'badcba')
('dcbae', 'dcba edcb')
('hello tset', 'tset banana')
('bisdr flyhgih gni', 'wihstlhgih gni nesdr')

PS:感谢orlp提供的解决方案 next()


m=lambda A,B:(b(A,B),b(B,A))
orlp

您也可以while len(A)>0用just 代替while A。同样if len(p)>0成为if p
orlp

if len(p)也可以if p。(上面已经说过了,但您错过了。)
mbomb007

@ mbomb007没有正确阅读。刚替换len(p)>0len(p)。谢谢:)
Kamehameha 2015年

甚至更短:while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
orlp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.