(1) Implement strStr()
暴力法:
class Solution {
public:
char *strStr(char *haystack, char *needle) {
if(!haystack || !needle)
return NULL;
int m=strlen(haystack);
int n=strlen(needle);
int j;
for(int i=0;i<=m-n;i++)
{
for(j=0;j<n;j++)
{
if(haystack[i+j]!=needle[j])
break;
}
if(j==n)
return haystack+i;
}
return NULL;
}
};
还有其他方法Boyer Moore法、KMP法[1]。
(2) Largest Rectangle in Histogram
原理见[2],非常详细:
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if(height.size()==0)
return 0;
stack<int> stk;
int i=0,maxarea=0;
height.push_back(0);
while(i<height.size())
{
if(stk.empty() || height[stk.top()]<=height[i])
stk.push(i++);
else
{
int t=stk.top();
stk.pop();
int tmp=height[t]*(stk.empty() ? i : i-stk.top()-1);
maxarea=max(maxarea,tmp);
}
}
return maxarea;
}
};
(3) Maximal Rectangle
在(2)的基础上[3]:
class Solution {
private:
int largestRectangleArea(vector<int> &height) {
if(height.size()==0)
return 0;
stack<int> stk;
int i=0,maxarea=0;
height.push_back(0);
while(i<height.size())
{
if(stk.empty() || height[stk.top()]<=height[i])
stk.push(i++);
else
{
int t=stk.top();
stk.pop();
int tmp=height[t]*(stk.empty() ? i : i-stk.top()-1);
maxarea=max(maxarea,tmp);
}
}
return maxarea;
}
public:
int maximalRectangle(vector<vector<char> > &matrix) {
int m=matrix.size();
if(m==0)
return 0;
int n=matrix[0].size();
if(n==0)
return 0;
int maxarea=0;
vector<vector<int>> height;
height.resize(m);
for(int i=0;i<m;i++)
height[i].resize(n);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(matrix[i][j]=='0')
height[i][j]=0;
else
height[i][j]=(i==0 ? 1 : height[i-1][j]+1);
}
for(int i=0;i<m;i++)
maxarea=max(maxarea,largestRectangleArea(height[i]));
return maxarea;
}
};
参考:
[1] http://blog.youkuaiyun.com/kenden23/article/details/17029625
[2] http://www.cnblogs.com/lichen782/p/leetcode_Largest_Rectangle_in_Histogram.html
[3] http://www.cnblogs.com/lichen782/p/leetcode_maximal_rectangle.html