这是一个面试问题
你必须在二维数组中找到一个字符串。输入包含2-D字符数组和给定字符串。您可以向八个方向之一移动。如果完全找到字符串,则输出包含字符串的第一个字母的位置,否则返回-1。如果可能的话,接受多个答案中的任何一个。
例如,输入:
b t g
p a d
r k j
String: rat
Output: (2,0)
我试过这个,但输出错误
5 5
A C P R C
X S O P C
V O V N I
W G F M N
Q A T I T
MICROSOFT
请帮助
#include<iostream>
#include<string>
using namespace std;
bool isInside(int x,int y,int m,int n)
{
if(x>=0&&x<m&&y>=0&&y<n)return true;
return false;
}
void findString(char mat[10][10],int m,int n,string str)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
int k=0,x=i,y=j;
bool flag=true;
if(mat[i][j]==str[k])
{
while(flag&&k<str.size())
{
int x1=x-1,x2=x+1,y1=y-1,y2=y+1;
if(isInside(x1,y1,m,n)&&mat[x1][y1]==str[k])
{
x=x1; y=y1; k++;
}
else if(isInside(x1,y,m,n)&&mat[x1][y]==str[k])
{
x=x1; y=y; k++;
}
else if(isInside(x1,y2,m,n)&&mat[x1][y2]==str[k])
{
x=x1; y=y2; k++;
}
else if(isInside(x,y1,m,n)&&mat[x][y1]==str[k])
{
x=x; y=y1; k++;
}
else if(isInside(x,y2,m,n)&&mat[x][y2]==str[k])
{
x=x; y=y2; k++;
}
else if(isInside(x2,y1,m,n)&&mat[x2][y1]==str[k])
{
x=x2; y=y1; k++;
}
else if(isInside(x2,y,m,n)&&mat[x2][y]==str[k])
{
x=x2; y=y; k++;
}
else if(isInside(x2,y2,m,n)&&mat[x2][y2]==str[k])
{
x=x2; y=y2; k++;
}
else flag=false;
}
if(flag==true)
{
cout<<endl<<"\("<<i<<","<<j<<")"<<endl;
return;
}
}
}
cout<<endl<<"-1"<<endl;
return;
}
int main()
{
int i,j,n,m;
char mat[10][10];
string str;
cout<<"enter the dimention of the matrix: ";
cin>>m>>n;
cout<<endl<<"enter the char matrix:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>mat[i][j];
cout<<endl<<"enter the test string: ";
cin>>str;
findString(mat,m,n,str);
return 0;
}
答案 0 :(得分:2)
您的搜索未完成,因为从指定位置您只尝试一个有效的邻居。
例如,从M
开始,如果您只关注底部I
,搜索将会停在那里;你需要尝试右上角I
,这需要一个递归的解决方案。
您的解决方案也不禁止同一个字符传递两次,我不确定这是否合法。
伪代码:
Try(i, j, Suffix):
if i < 0 or i >= m or j < 0 or j >= n:
# No such position
return
if Mat[i][j] == Suffix[0]:
if len(Suffix) == 1:
# The whole string was matched
print "Found !"
return
# Mark the position (optional)
Mat[i][j]= uppercase(Mat[i][j])
# Try all 8 neighbors
Try(i+1, j, Suffix[1:])
Try(i+1, j+1, Suffix[1:])
Try(i, j+1, Suffix[1:])
...
# Unmark the position (optional)
Mat[i][j]= lowercase(Mat[i][j])
你用
来调用它for i in range(m):
for j in range(n):
Try(i, j, String)