CODING

 輸出兩字符串公共子串及連續公共子串的長度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     }
LCS, LCSstrict

判斷兩字符串是否相同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 };
KMP,Next

 快排,歸併,插入,冒泡,選擇排序,堆排序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    
Permut, combination

折半查找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     }
BinarySearch

樹的前中後續遍歷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     }
Tree traveler

判斷相同樹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  
SameTree

判斷鏈表有環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     }
HasCycle
 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     }
NumTrees

 數字反轉字符串

 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     }
Reverse
相關文章
相關標籤/搜索