問題:一個(gè)字符串可以由另一個(gè)字符串移位得到,例如abcd
,可以由bcad
移位得到。
問題分析
這個(gè)問題表面上說的是字符串,但是其實(shí)更進(jìn)一步可以理解為兩個(gè)字符數(shù)組的元素是否一致。最簡(jiǎn)單和直白的方式,無異于用兩層循環(huán)的方式來進(jìn)行循環(huán)判斷。這是常規(guī)方案一。
還有方案二,則是需要用到數(shù)據(jù)結(jié)構(gòu),例如,將一個(gè)字符串轉(zhuǎn)換成一個(gè)set。循環(huán)另一個(gè)數(shù)組,往set中插入數(shù)據(jù),如果一直是失敗的,則true。有一次插入成功了,則false。
方案
如果我們?cè)谵D(zhuǎn)換一下思想,字符其實(shí)在計(jì)算機(jī)中的表現(xiàn),它的實(shí)質(zhì)上也是數(shù)字,比如ASCII碼中,字符a
是可以轉(zhuǎn)換成數(shù)字97的,所以兩個(gè)數(shù)組其實(shí)只要求元素之間的差的和,如果等于0就可以判斷是否相等。
例如:
1,2,34 和 2,3,14
則:
1-2=-1
2-3=-1
3-1=2
4-4=0
差的和:
-1+-1+2+0=0
但是,這樣只是判斷了移位,并沒有判斷基準(zhǔn)位置。比如,13
和22
是可以判斷成立的,因此需要增加判斷兩個(gè)數(shù)組的乘積是否相等。來判斷基準(zhǔn)位置是否一致。
Python 實(shí)現(xiàn)
def test(old,new):
if len(old) <= 0 or len(new) <= 0 or len(old) != len(new):
return false;
oldArr = map(ord, old)
newArr = map(ord, new)
total = 0
newPro = 1
oldPro = 1
for i in xrange(0,len(oldArr)):
total += newArr[i] - oldArr[i]
newPro = newT * newArr[i]
oldPro = oldT * oldArr[i]
if total == 0 and newPro == oldPro:
return True
else :
return False
if __name__ == '__main__':
print test('13', '22')
C 語言核心實(shí)現(xiàn)
#include<stdio.h>
int test(char[],int,char[],int);
int main(){
char old[]={'b','c','a','d'};
char new[]={'a','b','c','d'};
int result = test(old,4,new,4);
printf("%d\n",result);
return 0;
}
int test(char old[],int oldLen,char new[], int newLen) {
if(oldLen <= 0 || newLen <= 0 || oldLen != newLen){
return 0;
}
int total = 0;
int newPro = 1;
int oldPro = 1;
for(int i=0; i<oldLen; i++){
total += (int)old[i] - (int)new[i];
newPro = newPro * new[i];
oldPro = oldPro * old[i];
}
if(total == 0 && newPro == oldPro){
return 1;
}
return 0;
}
局限
我所寫實(shí)現(xiàn)依賴于ASCII碼,當(dāng)如果字符串是Unioncode編碼的字符,則就會(huì)出現(xiàn)問題。容我有空去研究一下,相處通用得解決方案。如有問題歡迎各位批評(píng)指正,不勝感激。