輸出兩字符串公共子串及連續公共子串的長度node
1 int LCS(string s1, string s2){ 2 int length1=s1.length(); 3 int length2=s2.length(); 4 5 int **A; 6 A=new int*[length1+1]; 7 for(int i=0;i<=length1;i++) 8 A[i]=new int[length2+1](); 9 10 for(int i=1;i<=length1;i++) 11 for(int j=1;j<=length2;j++){ 12 if(s1[i-1]==s2[j-1]) 13 A[i][j]=A[i-1][j-1]+1; 14 else{ 15 A[i][j]=max(A[i-1][j],A[i][j-1]); 16 } 17 } 18 19 for(int i=0;i<=length1;i++) 20 delete A[i]; 21 delete A; 22 23 return A[length1][length2]; 24 } 25 int LCSstrict(string s1, string s2){ 26 int length1=s1.length(); 27 int length2=s2.length(); 28 int Max=-1; 29 int **A; 30 A=new int*[length1+1]; 31 for(int i=0;i<=length1;i++) 32 A[i]=new int[length2+1](); 33 34 for(int i=1;i<=length1;i++) 35 for(int j=1;j<=length2;j++){ 36 if(s1[i-1]==s2[j-1]){ 37 A[i][j]=A[i-1][j-1]+1; 38 if(Max<A[i][j]) 39 Max=A[i][j];} 40 else{ 41 A[i][j]=0; 42 } 43 } 44 45 for(int i=0;i<=length1;i++) 46 delete A[i]; 47 delete A; 48 49 return Max; 50 }
判斷兩字符串是否相同KMP 數組
1 class Solution { 2 public: 3 bool KMP(string s1, string s2){ 4 if(s1.length()<s2.length()){ 5 swap(s1,s2); 6 } 7 int * next=new int[s2.length()]; 8 Next(next,s2); 9 // for(int i=0;i<s2.length();i++) 10 // cout<<next[i]<<" "; 11 int index=0; 12 for(int i=0;i<s1.length();i++){ 13 if(s1[i]==s2[index]){ 14 index++; 15 }else{ 16 if(index!=0) 17 {index=next[index-1]; 18 i--; 19 } 20 } 21 if(index==s2.length()) 22 return true; 23 } 24 return false; 25 } 26 private: 27 void Next(int next[],string str){ 28 int length=str.length(); 29 int index=0; 30 next[0]=0; 31 for(int i=1;i<length;i++){ 32 if(str[i]==str[index]){ 33 next[i]=index+1; 34 index++; 35 }else { 36 index=0; 37 next[i]=0; 38 } 39 } 40 } 41 };
快排,歸併,插入,冒泡,選擇排序,堆排序ide
1 void QuickSort(vector<int> & A,int left, int right){ 2 //int b[]={1,2,4,3,5,1,4,2,6}; 3 //vector<int> a(b,b+9); 4 //for(vector<int>::iterator iter=a.begin();iter!=a.end();iter++)cout<<*iter<<" "; 5 if(left<right){ 6 int index=rand()%(right-left)+left; 7 8 swap(A[left],A[index]); 9 int i=left,j=right+1; 10 do{ 11 do i++; 12 while(A[i]<A[left]); 13 do j--; 14 while(A[j]>A[left]); 15 if(i<j) 16 swap(A[i],A[j]); 17 //else break; 18 }while(i<j); 19 20 swap(A[left],A[j]); 21 22 QuickSort(A,left,j-1); 23 QuickSort(A,j+1,right); 24 }else return; 25 } 26 void MergeSort(int *A, int left,int right){ 27 if(left<right){ 28 int index=(left+right)/2; 29 MergeSort(A,left,index); 30 MergeSort(A,index+1,right); 31 Merge(A,left,right); 32 }else return; 33 } 34 void InsertSort(int *A, int length){ 35 //把數插入到已排好序的數組中,插入位置後面數據依次後移 36 for(int i=1;i<length;i++){ 37 int j=0; 38 while(A[j]<A[i]&&j<i)j++; 39 int tmp=A[j]; 40 A[j]=A[i]; 41 for(int x=i;x>j;x--) 42 A[x]=A[x-1]; 43 } 44 } 45 void BubbleSort(int *A, int length){ 46 //相鄰元素交換位置,使小值上移 47 for(int i=0;i<length--;){ 48 for(int j=0;j<length;j++){ 49 if(A[j]>A[j+1]) 50 swap(A[j],A[j+1]); 51 } 52 } 53 } 54 void SelectSort(int *A , int length){ 55 //選出當前數組中最值,放於相應位置 56 for(int i=0;i<length;i++){ 57 int Min=A[i],index=i; 58 for(int j=i;j<length;j++){ 59 if(Min>A[j]){ 60 index=j; 61 Min=A[j]; 62 } 63 } 64 swap(A[i],A[index]); 65 } 66 } 67 68 void HeapSort(vector<int> &A){ 69 int length=A.size(); 70 for(int i=length/2-1;i>=0;i--) 71 HeapInit(A,i,length); 72 for(int i=0;i<length;i++){ 73 swap(A[0],A[length-i-1]); 74 HeapInit(A,0,length-i-1); 75 } 76 } 77 void HeapInit(vector<int> &A, int k , int n){ 78 int i=k; 79 int j=2*k+1; 80 while(j<n){ 81 if(j+1<n&&A[j]<A[j+1]) 82 j++; 83 if(A[i]>A[j]) 84 break; 85 else{ 86 swap(A[i],A[j]); 87 i=j; 88 j=j*2+1; 89 } 90 } 91 }
排列,組合ui
1 void permut1 (vector<int> &A, int Start, int End, vector<vector<int> > &B){ 2 if(Start>=End){ 3 B.push_back(A); 4 }else{ 5 for(int i=Start;i<End;i++){ 6 swap(A[i],A[Start]); 7 permut1(A,Start+1, End,B); 8 swap(A[i],A[Start]); 9 } 10 } 11 /*調用及輸出參考 12 int b[]={1,2,3,4,5,6}; 13 vector<int> A(b,b+6); 14 vector<vector<int> > B; 15 sol->permut1(A,0,A.size(),B); 16 int i=0; 17 for(vector<vector<int> >::iterator iter=B.begin();iter!=B.end();iter++){ 18 cout<<++i<<" "; 19 for(vector<int>::iterator item=(*iter).begin();item!=(*iter).end();item++) 20 cout<<*item<<" "; 21 cout<<endl; 22 } 23 */ 24 } 25 void permut2(vector<int> &A, int Start, int End){ 26 // sol->permut2(A,0,A.size()); 27 if(Start>=End){ 28 for(vector<int>::iterator iter= A.begin();iter!=A.end();iter++) 29 cout<<*iter<<" ";cout<<endl; 30 }else{ 31 for(int i=Start;i<End;i++){ 32 swap(A[i],A[Start]); 33 permut2(A,Start+1, End); 34 swap(A[i],A[Start]); 35 } 36 } 37 } 38 void combination(vector<int> &A){ 39 int length=A.size(); 40 float sum=pow(2.0,(float)length); 41 for(int i=0,x;i<sum;i++){ 42 x=i; 43 for(int j=0;j<length;j++){ 44 if(x%2==1) 45 cout<<" "<<A[length-1-j]; 46 x=x>>1; 47 }cout<<endl; 48 } 49 } 50
折半查找spa
1 int binarySearch(int *A, int k,int length){ 2 //折半搜索 3 //cout<<sol->binarySearch(b,-10,sizeof(b)/sizeof(*b))<<endl; 4 int left=0,right=length; 5 int index=(left+right)/2; 6 while(index!=left&&index!=right){ 7 if(A[index]==k) 8 break; 9 if(A[index]<k){ 10 left=index; 11 index=(left+right)/2; 12 } 13 if(A[index]>k){ 14 right=index; 15 index=(right+left)/2; 16 } 17 cout<<left<<"-"<<index<<"-"<<right<<"-"<<endl; 18 }cout<<endl; 19 if(A[index]==k) 20 return index; 21 else return -1; 22 }
樹的前中後續遍歷3d
1 struct TreeNode { 2 int val; 3 TreeNode *left; 4 TreeNode *right; 5 TreeNode(int x) : val(x), left(NULL), right(NULL) {} 6 };
1 void PreOrderSearch(TreeNode *p){ 2 if(p){ 3 cout<<p->val<<" "; 4 PreOrderSearch(p->left); 5 PreOrderSearch(p->right); 6 } 7 } 8 void InOrderSearch(TreeNode *p){ 9 if(p){ 10 InOrderSearch(p->left); 11 cout<<p->val<<" "; 12 InOrderSearch(p->right); 13 } 14 } 15 void PostOrderSearch(TreeNode *p){ 16 if(p){ 17 PostOrderSearch(p->left); 18 PostOrderSearch(p->right); 19 cout<<p->val<<" "; 20 } 21 }
判斷相同樹code
1 bool isSameTree(TreeNode *p, TreeNode *q) { 2 if(p==NULL&&q==NULL) 3 return true; 4 else if((p==NULL&&q!=NULL)||(q==NULL&&p!=NULL)||(p->val!=q->val)) 5 return false; 6 if(p->val==q->val) 7 return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right); 8 9 } 10
判斷鏈表有環blog
1 struct ListNode{ 2 int val; 3 ListNode* next; 4 ListNode(int x):val(x), next(NULL){}; 5 ListNode(int x,ListNode *node):val(x), next(node){}; 6 };
1 bool hasCycle(ListNode *head) { 2 ListNode * p1=head; 3 ListNode * p2=head; 4 while(p1!=NULL&&p2!=NULL&&p2->next!=NULL){ 5 p1=p1->next; 6 p2=p2->next->next; 7 if(p1==p2) 8 return true; 9 } 10 return false; 11 }
1 ListNode* MergeList(ListNode * p,ListNode * q){ 2 if(!p)return q; 3 if(!q)return p; 4 ListNode * head,*cur; 5 if(q->val<p->val){ 6 head=q; 7 q=q->next;} 8 else { 9 head=p; 10 p=p->next; 11 } 12 cur=head; 13 14 while(p&&q){ 15 if(q->val<=p->val){ 16 cur->next=q; 17 cur=q; 18 q=q->next;} 19 else{ 20 cur->next=p; 21 cur=p; 22 p=p->next; 23 } 24 } 25 cur->next=(q==NULL)?p:q; 26 return head; 27 }
n個節點的BST樹有多少種排序
1 int numTrees(int n) {//BST數量 2 int* A=new int[n+1]; 3 A[0]=1;A[1]=1;A[2]=2; 4 for(int x=3;x<=n;x++) 5 { 6 A[x]=0; 7 for(int i=0,j=x-1;i<x;i++,j--){ 8 A[x]+=A[i]*A[j]; 9 } 10 } 11 return A[n]; 12 }
數字反轉字符串
1 int reverse(int x) { 2 int y=0; 3 int f=1; 4 if(x<0){ 5 f=-1; 6 x*=-1; 7 } 8 int tmp=0; 9 while(x>=1){ 10 tmp=x-10*(x/10); 11 y=10*y+tmp; 12 x=x/10; 13 } 14 y*=f; 15 return y; 16 }