亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

長度為 2^k + k - 1 的 binary string,使其任意一個長度為 k 的 substring 都是唯一的

長度為 2^k + k - 1 的 binary string,使其任意一個長度為 k 的 substring 都是唯一的

呼如林 2019-04-08 11:17:30
要求找出長度為2^k+k-1的binarystring,其任意一個長度為k的substring都是唯一的。例如,當k=2時,需要找到長度為5的binarystring,使其任意連續兩位在整個string內是唯一的。滿足條件的解共有4個:00110、10011、11001、01100。以00110為例,00、01、11、10都只出現了一次。k=3時,就需要找到長度為10的binarystring,使其任意連續三位在整個string內是唯一的。一共有16個解,其中字典序最小一個是0001011100。k=4時,有256個解,其中字典序最小的一個是0000100110101111000。k=5時,有65536個解,其中一個是000001000110010100111010110111110000。現在我想問的兩個問題是:1、有什么算法可以快速找出一個任意解,或是找出所有的解?2、看起來似乎k=n時的解的數量是k=n-1時的解的數量的平方。但是能否證明?十分感謝諸大神。
查看完整描述

2 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

關于計算字符串的問題,用了個比較笨的辦法,思路:
1、將字符串形成一個有向圖,這個圖是有環的,圖論算法掌握的不是太好啊,有誰有這方面研究的請指導;
2、然后選擇某個節點做起點,求取可以遍歷不重復節點的全部路徑
3、按照節點順序組合成字符串,如果字符串長度符合長度要求,則加回到結果集中,否則丟棄
4、計算結果集的空間大小,則得出全部結果數量,如果只要一條路徑,在求得一個結果集的時候跳出就可以了
下面是用Python做的代碼,有興趣的可以一起研究算法優化的辦法。
importsys
importtypes
deffind_path(s_map,slen):
res=set()
if(s_map):
foriins_map:
used=list()
used.append(i)
res=find_sub(s_map,used,res,slen)
returnlen(res),res
deffind_sub(s_map,used,res,slen):
if(set(used)!=set(s_map)):
forxins_map[used[-1]]:
if(xnotinused):
used.append(x)
printused
if(set(used)==set(s_map)):
sub=used[:-1]
s=''
foriinsub:
s+=i[0]
s+=used[-1]
prints,len(s),len(s_map)
if(len(s)==slen):
prints
res.add(s)
else:
find_sub(s_map,used,res,slen)
used.remove(x)
else:
continue
returnres
defbuild_map(s_list):
s_map=dict()
forsins_list:
l=(s_list[0:])
l.remove(s)
s_map[s]=[iforiinlifs[1:]==i[:-1]]
returns_map
defbinary_strings(k):
iftype(k)istypes.IntType:
return[(str(bin(i))[2:]).rjust(k,'0')foriinxrange(2**k)]
defmain():
printfind_path(build_map(binary_strings(2)),2**2+2-1)
printfind_path(build_map(binary_strings(3)),2**3+3-1)
printfind_path(build_map(binary_strings(4)),2**4+4-1)
if__name__=='__main__':
sys(exit(main()))
                            
查看完整回答
反對 回復 2019-04-08
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

直接用遍歷就可以了吧?
importsys
#listallbitstringwithalength2^k+k-1,and
#eachksubstringisdifferent
classbitString:
def__init__(self,k):
self.k=k
self.num=0
defgenerate(self):
self.num+=1
defgetString(self):
s=bin(self.num)[2:]
return"0"*(self.k-len(s))+s
deftryAppend(bitStr,k,oneBit,stringSet):
#print"tring:",bitStr,":",oneBit
newString=bitStr[-(k-1):]+oneBit
ifint(newString,2)instringSet:
return
eliflen(bitStr)==2**k+k-2:
print"found:",bitStr+oneBit
return
stringSet.add(int(newString,2))
#printstringSet
tryAppend(bitStr+oneBit,k,"0",stringSet)
tryAppend(bitStr+oneBit,k,"1",stringSet)
stringSet.discard(int(newString,2))
defgeneratBitString(initString,k):
s=set()
s.add(int(initString,2))
#prints
tryAppend(initString,k,"0",s)
tryAppend(initString,k,"1",s)
defgeneratBitStringAll(k):
b=bitString(k)
foriinrange(2**k):
generatBitString(b.getString(),k)
b.generate()
pass
if__name__=="__main__":
k=int(sys.argv[1])
generatBitStringAll(k)
要生成全部,就調用generatBitStringAll,只要生成部分,就只需要調用generatBitStrings
測試了一下,計算k為3,4,5時都沒問題, 但是6就很慢,還有優化的空間
暫時沒有證明問題2,但看起來是成立的
   
                            
查看完整回答
反對 回復 2019-04-08
  • 2 回答
  • 0 關注
  • 429 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號