2015-08-05 3 views
-1

Я хочу знать подход о, как я могу compress строку, как если бы я дал некоторую строку ABCABCABC, чем я имею в виду, что я могу найти подстроку в ABC, которая frequently occurs поэтому он будет сжат как 3ABC. Другой способ, если строка, такая как ABCABCBC, приведена здесь ABC является подстрокой frequently occurring, поэтому она сжата как 2ABC1BC. Как вы можете видеть, я рассматриваю только adjacent substrings.Я хочу знать подход сжать любую строку

+2

По принципу Дирихле [] (https://en.wikipedia.org/wiki/Pigeonhole_principle), любой алгоритм сжатия без потерь, что делает некоторые строки короче, будут обязательно делать некоторые другие строки больше. Так что «сжимать любую строку», к сожалению, невозможно. – Kevin

+0

Спасибо Jaimin Mody. Код работает отлично. –

ответ

0
s='FLFLAFLAFLAF' 


def check(str_check,str): 

    try: 
     index=str.index(str_check) 
    except Exception: 
     index=9999 
    return index 

def max_index(i,j,sub_str): 
    if(i>=0 and j<=len(count)): 
     try: 
      j=count.index(max(count[i:j])) 
     except Exception: 
      j=-1 
     try: 
      sub_str_index=int(sub_str.index(sub_list[j])) 
     except Exception: 
      sub_str_index=-1 
     temp=int(count[j]) 
     if len(sub_str)==0: 
      return "" 
     elif(count[j]==1 or int(count[j])*len(sub_list[j])>len(sub_str)): 
      for i in range (len(sub_str)): 
       count[j+i]=0 
      return "1"+ sub_str 
     else: 
      #count[j]=0 
      return max_index(0,sub_str_index,sub_str[0:sub_str_index]) + str(temp) + sub_list[j] + max_index(len(sub_str[0:sub_str_index])+(int(temp)*len(sub_list[j])),len(sub_str),sub_str[len(sub_str[0:sub_str_index])+(int(temp)*len(sub_list[j])): len(sub_str)]) 







sub_list=sorted(set([s[i:i+j] for j in range(1,len(s)+1) for i in range(len(s)-j+1)])) 
length=len(s) 
length1=len(sub_list) 
count=[] 
for i in range (length1): 
    cnt=0 
    j=0 
    while(j<length): 
     k=check(sub_list[i],s[j:]) 
     if k==9999: 
      break 
     if (s[j+k:j+k+len(sub_list[i])]==sub_list[i]): 
      if(cnt>=1 and s[j+k-len(sub_list[i]):j+k]==sub_list[i]): 
       j=j+k+1 
       cnt=cnt+1 
      elif (cnt==0): 
       j=j+k+1 
       cnt=cnt+1 
      else: 
       j=length 
     else: 
      j=length 
    count.append(cnt) 


print "SUBLIST" 
print sub_list 
print "count" 
count1=count 
print count1 
j=len(count) 
i=0 
max_ele=max(count) 
while(max_ele in count): 
    max_in=count.index(max(count[i:j])) 
    print max_index(i,j,s) 
    count=count1 
    count[max_in]=0 
+0

"FLFLAFLAFLAF" Если вы дадите этот тип ввода, вы получите выход, как указано ниже: 1FL3FLA1F 1FLF3LAF –

Смежные вопросы