최단 고유 식별 하위 문자열


23

문자열 목록이 주어지면, 각 문자열을 목록에있는 다른 문자열의 하위 문자열이 아닌 비어 있지 않은 하위 문자열 중 하나로 대체하십시오.

목록을 감안할 때 ["hello","hallo","hola"], "hello"바로 교체해야합니다 "e"이 문자열이 포함되어 있지으로 "hallo"하고 "hola"있으며 가능한 한 짧게이다. "hallo"중 하나에 의해 대체 될 수 "ha"또는 "al""hola"의 의해 "ho", "ol"또는 "la".

규칙

  • 문자열이 비어 있지 않고 같은 문자의 알파벳 문자 만 포함한다고 가정 할 수 있습니다.
  • 목록에있는 각 문자열에 대해 이러한 하위 문자열이 존재한다고 가정 할 수 있습니다. 즉, 목록의 문자열이 다른 문자열의 하위 문자열이 될 수 없습니다.
  • 입력 및 출력은 임의의 합리적인 형식 일 수 있습니다.
  • 이것은 이므로 원하는 언어로 가능한 적은 바이트를 사용하십시오.

테스트 사례

대부분의 경우 하나의 가능한 출력 만 제공됩니다.

["ppcg"] -> ["p"] (or ["c"] or ["g"])
["hello","hallo","hola"] -> ["e","ha","ho"]
["abc","bca","bac"] -> ["ab","ca","ba"]
["abc","abd","dbc"] -> ["abc","bd","db"]
["lorem","ipsum","dolor","sit","amet"] -> ["re","p","d","si","a"]
["abc","acb","bac","bca","cab","cba"] -> ["abc","acb","bac","bca","cab","cba"]

관련 : 최단 식별 하위 문자열 -비슷한 아이디어이지만 더 많은 규칙과 성가신 형식.


""단일 "ppcg"사례에 대해 고유하지 않은 (빈 문자열) 이유는 무엇 입니까?
MooseBoys 2018 년

2
@MooseBoys 문자열 목록이 주어지면 각 문자열을 비어 있지 않은 하위 문자열 중 하나로 대체하십시오
Mr. Xcoder

답변:




4

Pyth , 12 바이트

mhf!ts}LTQ.:

여기 사용해보십시오!

작동 원리

Basicaly는 목록의 문자열 중 하나에서만 발생하는 (즉, 해당 문자열에 고유 한) 각 부분 문자열을 필터링하여 첫 번째 문자열을 가져옵니다.

mhf!ts}LTQ.:     Full program, Q=eval(stdin_input())
m         .:     Map over Q and obtain all the substrings of each.
  f              And filter-keep those that satisfy (var: T)...
      }LTQ       ... For each string in Q, yield 1 if it contains T, else 0.
   !ts           ... Sum the list, decrement and negate. 
 h               Head. Yields the first valid substring, which is always the shortest.

4

프롤로그 (SWI) , 175 (163) 바이트

S/L/R:-sub_string(S,_,L,_,R).
[H|T]+[I|R]:-string_length(H,L),between(1,L,X),H/X/I,T+R.
R+R.
L-R:-L+R,forall(member(E,L),findall(_,(member(F,R),\+ \+ E/_/F),[_])).

온라인으로 사용해보십시오!

여기에있는 대부분의 내용은 분명하지만,

설명

서명 : ( += 입력, ?= 선택, -= 출력, := 표현식)

  • sub_string(+String, ?Before, ?Length, ?After, ?SubString)
  • string_length(+String, -Length)
  • member(?Elem, ?List)
  • between(+Low, +High, ?Value)
  • findall(+Template, :Goal, -Bag)
  • forall(:Cond, :Action)

\+ \+그냥 not not(즉, 일치를 부울로 변환합니다 (이 경우에는 두 ps를 ppcg개별적으로 일치시키지 못합니다))


작업을위한 올바른 도구 : P 마음이 정말 장황하다는 사실을 제외하고
ASCII 전용


4

J , 30 29 25 바이트

1(|:(0{-.&,)"_1]\.)<\\.&>

온라인으로 사용해보십시오!

                   <\\.&>        a 3-dimensional array of substrings
1 |:                             transpose each matrix to sort the substrings by length
1              ]\.               all choices where one word is missing
    (0{-.&,)"_1                  for every matrix, flatten, remove substrings
                                  that are present in the corresponding complement,
                                  pick first


3

JavaScript (ES6), 93 바이트

a=>a.map(s=>(L=s.length,g=n=>a.every(S=>S==s|!~S.search(u=s.substr(n%L,n/L+1)))?u:g(n+1))(0))

온라인으로 사용해보십시오!

방법?

입력 배열 a [] 에서 길이 L 각 문자열 s 에 대해 n = 0으로 시작 하여 재귀 함수 g () 를 사용하여 모든 하위 문자열을 생성합니다. US 와를 :

u = s.substr(n % L, n / L + 1)

예를 들어 s = "abc"L = 3 인 경우 :

 n | n%L | floor(n/L+1) | u
---+-----+--------------+-------
 0 |  0  |       1      | "a"
 1 |  1  |       1      | "b"
 2 |  2  |       1      | "c"
 3 |  0  |       2      | "ab"
 4 |  1  |       2      | "bc"
 5 |  2  |       2      | "c"
 6 |  0  |       3      | "abc"
 7 |  1  |       3      | "bc"
 8 |  2  |       3      | "c"

일부 하위 문자열은 여러 번 생성되지만 중요하지 않습니다. 중요한 것은 길이 N의 모든 하위 문자열이 길이 N + 1의 하위 문자열보다 먼저 생성 된 것 입니다.

다른 문자열 S 에서 u 를 찾을 수없는 즉시 프로세스를 중지합니다 .a []의 . 이는 챌린지 규칙 # 2에 따라 최악의 경우 u == s 일 때 발생합니다 .

목록에 문자열이 없으면 다른 문자열의 하위 문자열이 아닙니다.

따라서 위의 예에서 7 단계 와 8 단계 는 실제로 처리되지 않습니다.


2

PowerShell , 107 바이트

($a=$args)|%{$(for($i=0;$i++-lt($g=($s=$_)|% Le*)){0..($g-$i)|%{$s|% s*g $_ $i}|?{!($a-match$_-ne$s)}})[0]}

온라인으로 사용해보십시오!

설명

제공된 각 문자열에 대해 전체 배열을에 할당하십시오 $a.

  • DO가 for문자열의 (로 1) 각각의 문자열 길이에 걸쳐 루프 (문자열 자체에 할당 $s하고 길이를$g )
  • 각 길이 ($i ) :
    • 0에서 길이까지 색인 루프를 만듭니다. $i 만들고 각 인덱스에 대해 다음을 수행하십시오.
      • 현재 문자열 ( $s) 의 하위 문자열을 위치에서 가져 옵니다.$_ (인덱스)와 길이$i
      • 해당 하위 문자열을 Where-Object(? )에 전달하고 다음과 같은 경우 반환하십시오.
        • $a현재 문자열을 포함 $s하지 않고 현재 하위 문자열과 일치하지 않는 배열의 하위 집합$_

문자열 수준으로 돌아 가면이 문자열의 모든 하위 문자열이 다른 문자열에서는 찾을 수 없으므로 첫 번째 [0]문자열 만 필요하므로 다음 문자열을 계속하십시오.


0

C # (Visual C # 대화식 컴파일러) 149 바이트

a=>a.Select(s=>{var t=s;for(int j=0,k,l=s.Length;j++<l;)for(k=-1;j+k++<l;)if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())j=k=l;return t;})

온라인으로 사용해보십시오!

덜 골프 ...

// a is an input array of strings
a=>
  // iterate over input array   
  a.Select(s=>{
    // t is the result string
    var t=s;
    // j is the substring length
    for(int j=0,k,l=s.Length;j++<l;)
      // k is the start index
      for(k=-1;j+k++<l;)
        // LINQ query to check if substring is valid
        // the tested string is collected in t
        if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())
          // break loops
          j=k=l;
    // return result
    return t;
  })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.