問題描述挺簡單的,就是給兩個字串,判斷乙個是否可以被另乙個迴圈移位(定義
向右迴圈移位)得到的字串
包含(也可為本身,也可為子串)
解法一我們可以先直接進行字串的移位工作,在進行字串包含的判斷,從而遍歷器所有的可能性
但是這個方法比較浪費,因為要遍歷所有的可能性並且要進行字串的移位,並且在移位的過程中一不小心就會將字串覆蓋掉,所以一定要小心
**如下
//直接翻轉
bool
judge(
char
*str1
,const
char
*str2
,int
len) }
if(str2
!=null)
} inti =
len;
for(i = 0; i <
len; i++)
str1
[0] = tmp; if
(strstr(
str1
,str2
) !=
null)
}return
false; }
紅字就是這段**的重點
在進行字串移位的過程中我們先把最後乙個字母儲存起來,防止被覆蓋掉
然後從最後乙個字母開始進行移位覆蓋,將它的前乙個的字母賦值給它自己,然後最後把你儲存的最後乙個字母賦值給第乙個位置即可
就是這樣!!!
j-1 tmp a
a
b
c
d
解法二我們可以先對迴圈移位後的結果進行分析,例如aabcd
aabcd-->daabc-->cdaab-->bcdaa-->abcda-->aabcd-->...
如果我們將後面移走的資料進行保留,會發現有如下規律
aabcd-->daabcd-->cdaabcd-->bcdaabcd-->abcdaabcd-->aabcdaabcd(s3)
我們可以發現如果s2可由s1迴圈移位得到,那麼s1必定為s3的子串(s3很明顯是s1的2倍
)這個方法比較簡單,難點是由s1得到s3,我們就要使用字串函式
bool
judge(
const
char
*str1
,const
char
*str2)
} if(
str2
!=null)
} char
str3[20] = ;
strcpy(str3,
str1
);//將str1的字串拷貝到str3中,s3="aabcd"
strcat(str3,
str1
);//將str1的字串拼接到str3中,s3="aabcdaabcd" if
(strstr(str3,
str2
) !=
null)
else
free(str3);
} int
main()
else
system(
"pause");
return
0; }
這個**本身是十分容易想到的,但是有考了很多字串函式的知識點
strcpy:字串拷貝函式講乙個字串拷貝到另乙個字串內,包括『\0』
strnpy:指定長度的拷貝,不會將『\0』拷貝進去
strcat:字串拼接函式,必須保持我們拼接的這個目的字串擁有足夠的空間來儲存這拼接的字串,在拼接的時候會將原字串後的『\0』去掉,並且在拼接完成後的字串後面新增『\0』
strncat:在拼接之後的字串會自動加『\0』
strstr:判斷乙個字串是不是另乙個字串的子串,
如果是返回乙個非空值
!!!而且在進行監視視窗監視的時候,監視只有在中斷的時候才可以用,並且在函式執行完結束以後,所有的變數都已釋放,監視的話都會顯示無法計算,所以我們可以在函式執行的時候打乙個斷點,就可以監視到了
字串處理面試題 字串包含問題
為了準備面試中出現的字串問題,我決定做乙個系列,以我自己的標準,將自己認為比較優秀的字串面試題整理一些。希望這樣做能夠形成解決字串問題的一般思路,能夠比較高效地解決字串問題。這個問題是看了 感謝 v july v 問題描述 有兩個任意字串sting a,sting b,實現如下函式 int cont...
面試題 字串翻轉
使用 c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str 使用c c 編寫函式,實現字串反轉,要求不使用任何系統函式,且時間複雜度最小,函式原型 char reverse str char str include i...
字串面試題 字串逆序
字串逆序可以說是最經常考的題目。這是一道入門級的題目。給定乙個字串s,將s中的字元順序顛倒過來,比如s abcd 逆序後變成s dcba 基本上沒有這麼考的,放在這裡主要是為了和後面的原地逆序做個對比。很簡單,直接分配乙個與原字串等長的字元陣列,然後反向拷貝一下即可。char reverse cha...