Skip to content

Commit c701a4a

Browse files
committed
整合了一些最近做的题
1 parent aca731f commit c701a4a

22 files changed

+1163
-0
lines changed

Diff for: P72.cpp

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include<iostream>
2+
#include<string>
3+
#include<algorithm>
4+
5+
using namespace std;
6+
7+
8+
class Solution {
9+
public:
10+
int minDistance(string word1, string word2) {
11+
int f[100][100][100];
12+
int len1,len2,len;
13+
string w1,w2;
14+
if (word1.length() > word2.length()) {
15+
w1=word2;
16+
w2=word1;
17+
}
18+
else {
19+
w1=word1;
20+
w2=word2;
21+
}
22+
len1 = w1.length();
23+
len2 = w2.length();
24+
cout << "length: " << len1 << " " << len2 << endl;
25+
cout << "word: " << word1 << " " << word2 << endl;
26+
len = max(len1,len2);
27+
for (int i=0;i<=len;i++)
28+
for (int j=0;j<=len;j++) {
29+
for (int k=0;k<=len;k++)
30+
f[i][j][k]=k;
31+
if (i<len1 && j<len2 && w1[i]==w2[j])
32+
f[i][j][1]=0;
33+
}
34+
for (int l=2;l<=len;l++) {
35+
for (int i=0;i<len1-l+1;i++)
36+
for (int j=0;j<len2-l+1;j++) {
37+
for (int k=0;k<l;k++) {
38+
// transfer
39+
f[i][j][l] = min(f[i][j][l], f[i][j][k] + f[i + k][j + k][l - k]);
40+
// 1. change
41+
f[i][j][l] = min(f[i][j][l], f[i][j][k] + f[i + k + 1][j + k + 1][l - k - 1] + 1);
42+
// 2. del
43+
f[i][j][l] = min(f[i][j][l], f[i][j][k] + f[i + k + 1][j + k][l - k] + 1);
44+
// 3. add has
45+
f[i][j][l] = min(f[i][j][l], f[i][j][k] + f[i + k][j + k + 1][l - k - 1] + 1);
46+
}
47+
}
48+
49+
}
50+
return f[0][0][len2];
51+
}
52+
53+
void test() {
54+
string s1("horse"),s2("ros");
55+
cout << minDistance(s1, s2) << endl;
56+
cout << minDistance("ros", "horse") << endl;
57+
cout << minDistance("horse", "ros") << endl;
58+
cout << minDistance("ros", "horse") << endl;
59+
cout << minDistance("intention", "execution") << endl;
60+
cout << minDistance("sea", "ate") << endl;
61+
return ;
62+
}
63+
};
64+
65+
int main()
66+
{
67+
Solution().test();
68+
return 0;
69+
}

Diff for: P79.cpp

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include<vector>
2+
#include<iostream>
3+
#include<cstdlib>
4+
5+
using namespace std;
6+
7+
class Solution {
8+
public:
9+
bool exist(vector<vector<char>>& board, string word) {
10+
int m,n;
11+
m=board.size();
12+
if (m==0) return false;
13+
n=board[0].size();
14+
if (n==0) return false;
15+
for (int i=0; i<m; i++)
16+
for (int j=0; j<n; j++)
17+
if (word[0]==board[i][j]) {
18+
char c=board[i][j];
19+
board[i][j]= '0';
20+
bool t=test(board,i,j,word,1);
21+
board[i][j]=c;
22+
if (t) return t;
23+
}
24+
return false;
25+
}
26+
bool test(vector<vector<char>> &b,int x,int y,const string &word,int l) {
27+
if (l>=word.length()) return true;
28+
if (b[x][y]!=word[l]) return false;
29+
char c=b[x][y];
30+
b[x][y]='0';
31+
int i,j,m,n;
32+
bool t;
33+
m=b.size();
34+
n=b[0].size();
35+
i=x+1;j=y;
36+
if (i<m) t=test(b,i,j,word,l+1);
37+
if (t) return t;
38+
39+
i=x;j=y+1;
40+
if (j<n) t=test(b,i,j,word,l+1);
41+
if (t) return t;
42+
43+
i=x-1;j=y;
44+
if (i>=0) t=test(b,i,j,word,l+1);
45+
if (t) return t;
46+
47+
i=x;j=y-1;
48+
if (j>=0) t=test(b,i,j,word,l+1);
49+
if (t) return t;
50+
b[x][y]=c;
51+
return false;
52+
}
53+
};
54+
55+
56+
int main() {
57+
vector<vector<char>> b={{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};
58+
cout << Solution().exist(b,"ABCCED");
59+
return 0;
60+
}

Diff for: P80.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include<vector>
2+
#include<iostream>
3+
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
int removeDuplicates(vector<int>& nums) {
9+
int i=1;
10+
while (i+1<nums.size()) {
11+
if (nums[i-1]==nums[i] && nums[i]==nums[i+1]) {
12+
nums.erase(nums.begin()+i);
13+
}
14+
else
15+
i++;
16+
}
17+
return nums.size();
18+
}
19+
};
20+
21+
int main() {
22+
vector<int> a={1,1,1,1,1,2,2,2,2,3,3,3,4,4,5};
23+
int len=Solution().removeDuplicates(a);
24+
for (int i=0;i<len;i++)
25+
cout<<a[i]<<" ";
26+
cout<<endl;
27+
return 0;
28+
}

Diff for: P81.cpp

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include<iostream>
2+
#include<algorithm>
3+
#include<vector>
4+
#include<cstdlib>
5+
6+
using namespace std;
7+
8+
class Solution {
9+
public:
10+
bool search(vector<int>& nums, int target) {
11+
if (nums.size() == 0) return false;
12+
return srch(nums.begin(), nums.end(), target);
13+
}
14+
bool srch(vector<int>::iterator beg, vector<int>::iterator end, int target) {
15+
vector<int>::iterator l, r, m, p;
16+
l = beg;
17+
r = end-1;
18+
// at beginning, a[r]<=a[l]
19+
// [l, r] [beg, end)
20+
while (l <= r)
21+
{
22+
m = l + (r - l) / 2;
23+
if (*m == target) return true;
24+
if (*l < *m) {
25+
p = search_n(l, m, 1, target);
26+
if (p != m) return true;
27+
l = m + 1;
28+
}
29+
else if (*l != *m) { //l>m
30+
p = search_n(m, r + 1, 1, target);
31+
if (p != r + 1) return true;
32+
r = m - 1;
33+
}
34+
else if (*m == *r) {
35+
auto k = srch(l, m, target);
36+
if (k) return k;
37+
k = srch(m + 1, r+1, target);
38+
if (k) return k;
39+
return false;
40+
}
41+
else if (*m > * r) {
42+
l = m + 1;
43+
}
44+
else {
45+
//cout << "???????ERR????" << endl;
46+
p = search_n(l, r + 1, 1, target);
47+
if (p != r + 1) return true;
48+
return false;
49+
}
50+
}
51+
return false;
52+
}
53+
};
54+
55+
int main() {
56+
vector<int> nums={2,5,6,0,0,1,2};
57+
cout<< Solution().search(nums,3) << endl;
58+
return 0;
59+
}

Diff for: P82.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode(int x) : val(x), next(NULL) {}
7+
* };
8+
*/
9+
class Solution {
10+
public:
11+
ListNode* deleteDuplicates(ListNode* head) {
12+
ListNode* p, *prev = nullptr;
13+
if (head==nullptr || head->next==nullptr) return head;
14+
auto v=head->val;
15+
16+
prev = nullptr;
17+
p = head;
18+
while (p!=nullptr) {
19+
if (p->next!=nullptr && p->val==p->next->val) {
20+
v = p->val;
21+
while (p!=nullptr && p->val==v) {
22+
if (prev!=nullptr) {
23+
prev->next=p->next;
24+
free(p);
25+
p=p->next;
26+
}
27+
else {
28+
head=head->next;
29+
free(p);
30+
p=head;
31+
}
32+
}
33+
}
34+
else {
35+
prev=p;
36+
p=p->next;
37+
}
38+
}
39+
return head;
40+
}
41+
42+
};

Diff for: P83.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode(int x) : val(x), next(NULL) {}
7+
* };
8+
*/
9+
class Solution {
10+
public:
11+
ListNode* deleteDuplicates(ListNode* head) {
12+
ListNode *p;
13+
p=head;
14+
while (p!=nullptr) {
15+
if (p->next!=nullptr && p->val==p->next->val)
16+
p->next=p->next->next;
17+
else
18+
p=p->next;
19+
}
20+
return head;
21+
}
22+
};

Diff for: P84.cpp

+70
Large diffs are not rendered by default.

Diff for: P85.cpp

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include "mhead.h"
2+
3+
using namespace std;
4+
5+
class Solution {
6+
public:
7+
int maximalRectangle(vector<vector<char>>& matrix) {
8+
int m=matrix.size();
9+
if (m==0) return 0;
10+
int n=matrix[0].size();
11+
if (n==0) return 0;
12+
13+
int **f = new int *[m];
14+
for (int i=0;i<m;i++) f[i]=new int[n];
15+
for (int i=0;i<m;i++)
16+
for (int j=0;j<n;j++) f[i][j]=matrix[i][j]-'0';
17+
18+
19+
int s1,s2;
20+
for (int i=0;i<m;i++)
21+
for (int j=0;j<n;j++) {
22+
for (int ri=0;ri<m;ri++)
23+
for (int rj=0;rj<n;rj++)
24+
{
25+
int x=i+ri,y=j+rj;
26+
if (x==i && y==j) continue;
27+
if (x>=m || y>=n) continue;
28+
if (matrix[x][y]==0) {
29+
f[x][y]=f[x-1][y-1];
30+
continue;
31+
}
32+
s1=0;
33+
if (ri>0 && y-1>=0) {
34+
for (int k=i;k<=x-1;k++) s1+=matrix[k][y];
35+
if (s1==x-i) {
36+
if (f[x-1][y-1]==(ri)*(rj))
37+
f[x-1][y] = max(f[x-1][y],f[x-1][y-1]+s1);
38+
else
39+
f[x-1][y] = max(f[x-1][y],s1);
40+
}
41+
else
42+
f[x-1][y] = max(f[x-1][y],f[x-1][y-1]);
43+
}
44+
s2=0;
45+
if (rj>0 && x-1>=0) {
46+
for (int k=j;k<=y-1;k++) s2+=matrix[x][k];
47+
if (s2==y-j) {
48+
if (f[x-1][y-1]==(ri)*(rj))
49+
f[x][y-1] = max(f[x][y-1],f[x-1][y-1]+s2);
50+
else
51+
f[x][y-1] = max(f[x][y-1],s2);
52+
}
53+
else
54+
f[x][y-1] = max(f[x][y-1],f[x-1][y-1]);
55+
}
56+
if (ri>0 && rj>0) {
57+
if (s1==x-i && s2==y-j) {
58+
if (f[x-1][y-1]==ri*rj)
59+
f[x][y] = max(f[x][y],f[x-1][y-1]+s1+s2+1);
60+
else
61+
f[x][y] = max(f[x][y],max(s1,s2)+1);
62+
}
63+
else
64+
f[x][y] = max(f[x][y],f[x-1][y-1]);
65+
}
66+
}
67+
for (int i1=0;i1<m;i1++) {
68+
for (int i2=0;i2<n;i2++)
69+
cout << f[i1][i2] << " ";
70+
cout << endl;
71+
}
72+
cout << i << " : "<< j << endl;
73+
}
74+
return f[m-1][n-1];
75+
76+
}
77+
void SolutionTest() {
78+
vector<vector<char>> a={
79+
{'1','0','1','0','0'},
80+
{'1','0','1','1','1'},
81+
{'1','1','1','1','1'},
82+
{'1','0','0','1','0'}
83+
};
84+
auto k = maximalRectangle(a);
85+
cout<<k<<endl;
86+
return;
87+
}
88+
};

0 commit comments

Comments
 (0)