Python??????????????????????е??????
?????bluebird8880 ???????[ 2017/2/8 16:10:25 ] ????????Python ??????? ?????
??????????????????????????????Python???????????????????????????????????????н???
1 # coding=utf-8
2
3 __all__=['ADTString']
4
5 class ADTString(object):
6 '''
7 ???????????????????????·???
8 '''
9 def __init__(self?? d=''):
10 '''
11 data????洢??
12 '''
13 self.data = d
14
15 def StrCopy(self):
16 '''
17 ?????????????????data
18 '''
19 return self.data
20
21 def ClearString(self):
22 '''
23 ???????
24 '''
25 self.data = ''
26
27 def StringEmpty(self):
28 '''
29 ?ж????????????????True??False
30 '''
31 return False if len(self.data) else True
32
33 def StrLength(self):
34 '''
35 ?????????????
36 '''
37 return len(self.data)
38
39 def StrCompare(self?? T):
40 '''
41 ???????T???б????????T????1???????T????0??С???T????-1
42 '''
43 len_S = self.StrLength()
44 len_T = T.StrLength()
45 len_min = min(len_S?? len_T)
46 len_max = max(len_S?? len_T)
47 i=j=0
48 while(True):
49 if (i>=len_min):
50 if len_min==len_max:
51 return 0
52 elif (j >=len_min):
53 return 1 if len_S > len_T else -1
54
55 if(self.data[i]==T.data[j]):
56 i=i+1
57 j=j+1
58 elif self.data[i]<T.data[j]:
59 return -1
60 elif self.data[i]>T.data[j]:
61 return 1
62
63 def Concat(self?? S2):
64 '''
65 ??????????S2
66 '''
67 return self.data+S2.data
68
69 def SubString(self?? pos?? len_):
70 '''
71 ?????????У???pos???????len_???????
72 pos?????????????
73 '''
74 if pos >= 0:
75 if len(self.data) < pos:
76 return -1
77 return self.data[pos:pos+len_]
78 else:
79 if len_==0 or pos==-1:
80 return ''
81 elif pos+len_==0 or abs(pos)<len_:
82 return self.data[pos:-1]+self.data[-1]
83 else:
84 return self.data[pos:pos+len_]
85
86 def Index(self?? T?? pos):
87 '''
88 ??????S?д?????T????????????????????????е?pos???????????γ????λ?????????-1
89 '''
90 len_T = T.StrLength()
91 len_S = self.StrLength()
92 if len_S < len_T + pos:
93 return -1
94
95 p1 = pos
96 p2 = pos + len_T
97 while(p2<=len_S):
98 if self.SubString(p1?? len_T) == T.data:
99 return p1
100 else:
101 p1=p1+1
102 p2=p2+1
103
104 if p2 > len_S:
105 return -1
106
107 def IndexBruteforce(self?? T?? pos):
108 '''
109 ?????????????????S?д?????T????????????????????????е?pos???????????γ????λ?????????-1?????????????????????
110 '''
111 len_T = T.StrLength()
112 len_S = self.StrLength()
113 i=pos
114 j=0
115 while(True):
116 if i >= len_S or j >= len_T:
117 break
118 if(self.data[i]==T.data[j]):
119 i=i+1
120 j=j+1
121 else:
122 i=i-j+1
123 j=0
124
125 return i-j if j>=len_T else -1
126
127 def GetNext(self):
128 '''
129 ????KMP??????????next????
130 '''
131 len_S=self.StrLength()
132 next=[0]
133 i=1
134 while(True):
135 if i>=len_S:
136 break
137
138 k = next[i-1]
139 while(self.data[k]!=self.data[i] and k!=0):
140 k=next[k-1]
141 if self.data[k]==self.data[i]:
142 next.append(k+1)
143 else:
144 next.append(0)
145
146 i=i+1
147 return next
148
149 def IndexKMP(self?? T?? pos):
150 '''
151 KMP?????????????S?д?????T????????????????????????е?pos???????????γ????λ?????????-1?????????????????????
152 '''
153 next=self.GetNext()
154 len_T = T.StrLength()
155 len_S = self.StrLength()
156 i=pos
157 j=0
158 while(True):
159 if i >= len_S or j >= len_T:
160 break
161 if(self.data[i]==T.data[j]):
162 i=i+1
163 j=j+1
164 else:
165 i=i+next[i]+1
166 j=0
167 return i-j if j>=len_T else -1
168
169
170
171 def Replace(self?? T?? V):
172 '''
173 ???V?滻????S?У????????????T?????????????
174 '''
175 string = ''
176 len_S = len(self.data)
177 len_T = len(T.data)
178 p1=p2=0
179 while(True):
180 pos = self.Index(T?? p2)
181 if pos == -1:
182 string+=self.data[p2:]
183 break
184 else:
185 p1=pos
186 string+=self.data[p2:p1]
187 string+= V.data
188 p2=p1+len_T
189
190 if string == '':
191 return self.data
192 else:
193 return string
194
195 def StrInsert(self?? pos?? T):
196 '''
197 ?????????pos???????????T;pos??????????????
198 '''
199 len_S = len(self.data)
200 if len_S < pos or len_S <abs(pos):
201 return -1
202
203 return self.data[:pos]+T.data+self.data[pos:]
204
205 def StrDelete(self?? pos?? len_):
206 '''
207 ?????????pos??????????len_????????
208 posС??0?????????
209 '''
210 len_S = len(self.data)
211 if pos >= 0:
212 if len_S < pos:
213 return -1
214 return self.data[:pos]+self.data[pos+len_:]
215 else:
216 if len_S < abs(pos) :
217 return -1
218 return self.data[:pos-len_]+self.data[pos:]
219
220 if __name__ == '__main__':
221 from ADTString import ADTString
222 # ????????readme???
223 print help(ADTString)
??????3?У?__all__?ж??????????????from <module> import * ??????????????
??????15~218?У??????Щ?????????????У???86~105?е?Index??????????SubString?????????????107~125?У??????????????????????149~167?У??????KMP????????????
??????223?У?????????????????????????ο??????
????????????????е??????????unittest??飬?????????У?????е????????????
1 # conding=utf-8
2
3 from ADTString import ADTString
4 import unittest
5
6 class TestADTStringMethods(unittest.TestCase):
7 def setUp(self):
8 self.obj = ADTString()
9
10 def tearDown(self):
11 pass
12
13 def test_StrCopy(self):
14 self.obj.data=''
15 self.assertEqual(self.obj.StrCopy()?? '')
16 self.obj.data='goodgoogle'
17 self.assertEqual(self.obj.StrCopy()?? 'goodgoogle')
18 self.obj.data='!'
19 self.assertEqual(self.obj.StrCopy()?? '!')
20
21 def test_ClearString(self):
22 self.obj.data='goodgoogle'
23 self.obj.ClearString()
24 self.assertEqual(self.obj.data?? '')
25
26 def test_StringEmpty(self):
27 self.obj.data=''
28 self.assertEqual(self.obj.data?? '')
29
30 def test_StrLength(self):
31 self.obj.data='123'
32 self.assertEqual(self.obj.StrLength()?? 3)
33 self.obj.data=''
34 self.assertEqual(self.obj.StrLength()?? 0)
35
36 def test_StrCompare(self):
37 obj_T=ADTString('goodgoogle')
38 self.obj.data='goodgoogle'
39 self.assertEqual(self.obj.StrCompare(obj_T)??0)
40 self.obj.data='goodgoogl'
41 self.assertEqual(self.obj.StrCompare(obj_T)??-1)
42 self.obj.data='goodgooglea'
43 self.assertEqual(self.obj.StrCompare(obj_T)??1)
44
45 def test_Concat(self):
46 self.obj.data='good'
47 obj_S2=ADTString('google')
48 self.assertEqual(self.obj.Concat(obj_S2)??'goodgoogle')
49 self.obj.data=''
50 self.assertEqual(self.obj.Concat(obj_S2)??'google')
51
52 def test_SubString(self):
53 self.obj.data='goodgoogle'
54 self.assertEqual(self.obj.SubString(0??0)??'')
55 self.assertEqual(self.obj.SubString(0??1)??'g')
56 self.assertEqual(self.obj.SubString(0??4)??'good')
57 self.assertEqual(self.obj.SubString(0??100)??'goodgoogle')
58 self.assertEqual(self.obj.SubString(100??1)??-1)
59 self.assertEqual(self.obj.SubString(-50??0)??'')
60 self.assertEqual(self.obj.SubString(-5??0)??'')
61 self.assertEqual(self.obj.SubString(-1??0)??'')
62 self.assertEqual(self.obj.SubString(-1??1)??'')
63 self.assertEqual(self.obj.SubString(-1??2)??'')
64 self.assertEqual(self.obj.SubString(-6??1)??'g')
65 self.assertEqual(self.obj.SubString(-6??6)??'google')
66 self.assertEqual(self.obj.SubString(-6??100)??'google')
67 self.assertEqual(self.obj.SubString(-6??10)??'google')
68
69 def test_Index(self):
70 self.obj.data='goodgoogle'
71 obj_T=ADTString('good')
72 self.assertEqual(self.obj.Index(obj_T?? 0)??0)
73 self.assertEqual(self.obj.Index(obj_T?? 1)??-1)
74 self.obj.data='googlegood'
75 self.assertEqual(self.obj.Index(obj_T?? 0)??6)
76 self.assertEqual(self.obj.Index(obj_T?? 7)??-1)
77 self.obj.data=''
78 self.assertEqual(self.obj.Index(obj_T?? 0)??-1)
79
80 def test_IndexBruteforce(self):
81 self.obj.data='goodgoogle'
82 obj_T=ADTString('good')
83 self.assertEqual(self.obj.Index(obj_T?? 0)??0)
84 self.assertEqual(self.obj.Index(obj_T?? 1)??-1)
85 self.obj.data='googlegood'
86 self.assertEqual(self.obj.Index(obj_T?? 0)??6)
87 self.assertEqual(self.obj.Index(obj_T?? 7)??-1)
88 self.obj.data=''
89 self.assertEqual(self.obj.Index(obj_T?? 0)??-1)
90
91 def test_IndexKMP(self):
92 self.obj.data='goodgoogle'
93 obj_T=ADTString('good')
94 self.assertEqual(self.obj.Index(obj_T?? 0)??0)
95 self.assertEqual(self.obj.Index(obj_T?? 1)??-1)
96 self.obj.data='googlegood'
97 self.assertEqual(self.obj.Index(obj_T?? 0)??6)
98 self.assertEqual(self.obj.Index(obj_T?? 7)??-1)
99 self.obj.data=''
100 self.assertEqual(self.obj.Index(obj_T?? 0)??-1)
101
102 def test_Replace(self):
103 self.obj.data='good'
104 obj_T=ADTString('good')
105 obj_V=ADTString('replace')
106 self.assertEqual(self.obj.Replace(obj_T?? obj_V)??'replace')
107 self.obj.data='googlegood'
108 self.assertEqual(self.obj.Replace(obj_T?? obj_V)??'googlereplace')
109 self.obj.data='goodgooglegood'
110 self.assertEqual(self.obj.Replace(obj_T?? obj_V)??'replacegooglereplace')
111 self.obj.data=''
112 self.assertEqual(self.obj.Replace(obj_T?? obj_V)??'')
113 self.obj.data='aaa'
114 self.assertEqual(self.obj.Replace(obj_T?? obj_V)??'aaa')
115
116 def test_StrInsert(self):
117 self.obj.data='goodgoogle'
118 obj_T=ADTString('insert')
119 self.assertEqual(self.obj.StrInsert(0??obj_T)??'insertgoodgoogle')
120 self.assertEqual(self.obj.StrInsert(100??obj_T)??-1)
121 self.assertEqual(self.obj.StrInsert(len(self.obj.data)??obj_T)??'goodgoogleinsert')
122 self.assertEqual(self.obj.StrInsert(4??obj_T)??'goodinsertgoogle')
123 self.assertEqual(self.obj.StrInsert(-1??obj_T)??'goodgooglinserte')
124 self.assertEqual(self.obj.StrInsert(-100??obj_T)??-1)
125
126 def test_StrDelete(self):
127 self.obj.data='goodgoogle'
128 self.assertEqual(self.obj.StrDelete(0??4)??'google')
129 self.assertEqual(self.obj.StrDelete(0??100)??'')
130 self.assertEqual(self.obj.StrDelete(-1??1)??'goodgooge')
131 self.assertEqual(self.obj.StrDelete(-2??3)??'goodgle')
132 self.assertEqual(self.obj.StrDelete(-2??100)??'le')
133 self.assertEqual(self.obj.StrDelete(-100??1)??-1)
134
135
136 suite = unittest.TestLoader().loadTestsFromTestCase(TestADTStringMethods)
137 unittest.TextTestRunner(verbosity=2).run(suite)
??????е??????£?
test_ClearString (__main__.TestADTStringMethods) ... ok
test_Concat (__main__.TestADTStringMethods) ... ok
test_Index (__main__.TestADTStringMethods) ... ok
test_IndexBruteforce (__main__.TestADTStringMethods) ... ok
test_IndexKMP (__main__.TestADTStringMethods) ... ok
test_Replace (__main__.TestADTStringMethods) ... ok
test_StrCompare (__main__.TestADTStringMethods) ... ok
test_StrCopy (__main__.TestADTStringMethods) ... ok
test_StrDelete (__main__.TestADTStringMethods) ... ok
test_StrInsert (__main__.TestADTStringMethods) ... ok
test_StrLength (__main__.TestADTStringMethods) ... ok
test_StringEmpty (__main__.TestADTStringMethods) ... ok
test_SubString (__main__.TestADTStringMethods) ... ok
----------------------------------------------------------------------
Ran 13 tests in 0.001s
OK
[Finished in 0.1s]
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11