数组与字符串数据结构:
例题1:二维数组中的查找
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length==0){
return false;
}
int row=0,col=matrix[0].length-1;
while(row<matrix.length&&col>=0){
if(matrix[row][col]==target){
return true;
}
if(matrix[row][col]<target){
++row;
}else{
--col;
}
}
return false;
}
}
例题2:替换空格
class Solution {
public String replaceSpace(String s) {
int count=0;
for(int i=0;i<s.length();++i){
if(s.charAt(i)==' '){
++count;
}
}
int newLength=s.length()+2*count;
//因为Java的String是不可变的,所以不能原地扩大并修改,必须new一个新字符数组。因此也没必要从后往前修改了
char[] c=new char[newLength];
int cIndex=0;
for(int i=0;i<s.length();++i){
if(s.charAt(i)!=' '){
c[cIndex++]=s.charAt(i);
}else{
c[cIndex++]='%';
c[cIndex++]='2';
c[cIndex++]='0';
}
}
return new String(c);
}
}
例题3:字符串匹配
next[i] 就是子串s[0…i]的最长相等前后缀的前缀最后一位的下标
class Solution {
public boolean patternMatching(String pattern, String value) {
int[] next=getNext(pattern);
int j=-1; //初始化j为-1,表示当前还没有任意一位被匹配
for(int i=0;i<value.length();++i){ //试图匹配text[i]
while(j!=-1&&value.charAt(i)!=pattern.charAt(j+1)){
j=next[j]; //不断回退,直到j回到-1或text[i]==pattern[j+1];
}
if(value.charAt(i)==pattern.charAt(j+1)){
++j;
}
if(j==pattern.length()-1){
return true;
}
}
return false;
}
public int[] getNext(String pattern){
int n=pattern.length();
int[] next=new int[n];
next[0]=-1;
int j=-1;
for(int i=1;i<n;++i){
while(j!=-1&&pattern.charAt(i)!=pattern.charAt(j+1)){
j=next[j];
}
if(pattern.charAt(i)==pattern.charAt(j+1)){
++j;
}
next[i]=j;
}
return next;
}
}
例题4:字符串匹配次数
class Solution {
public int patternMatchingCount(String pattern, String value) {
int[] next=getNext(pattern);
int result=0;
int j=-1; //初始化j为-1,表示当前还没有任意一位被匹配
for(int i=0;i<value.length();++i){ //试图匹配text[i]
while(j!=-1&&value.charAt(i)!=pattern.charAt(j+1)){
j=next[j]; //不断回退,直到j回到-1或text[i]==pattern[j+1];
}
if(value.charAt(i)==pattern.charAt(j+1)){
++j;
}
if(j==pattern.length()-1){
++result;
j=next[j];
}
}
return result;
}
public int[] getNext(String pattern){
int n=pattern.length();
int[] next=new int[n];
next[0]=-1;
int j=-1;
for(int i=1;i<n;++i){
while(j!=-1&&pattern.charAt(i)!=pattern.charAt(j+1)){
j=next[j];
}
if(pattern.charAt(i)==pattern.charAt(j+1)){
++j;
}
next[i]=j;
}
return next;
}
}
例题5:顺时针打印矩阵
class Solution {
int[] result;
int index=0;
public int[] spiralOrder(int[][] matrix) {
int n=matrix.length;
if(n==0){
return new int[0];
}
int m=matrix[0].length;
result=new int[n*m];
for(int start=0;2*start<n&&2*start<m;++start){
circleOrder(start,matrix);
}
return result;
}
public void circleOrder(int start,int[][] matrix){
int n=matrix.length,m=matrix[0].length;
int endRow=n-start-1,endCol=m-start-1;
for(int i=start;i<=endCol;++i){
result[index++]=matrix[start][i];
}
for(int i=start+1;i<=endRow;++i){
result[index++]=matrix[i][endCol];
}
if(start<endRow){
for(int i=endCol-1;i>=start;--i){
result[index++]=matrix[endRow][i];
}
}
if(start<endCol){
for(int i=endRow-1;i>start;--i){
result[index++]=matrix[i][start];
}
}
}
}