在2D矩阵中搜索模式

时间:2014-10-15 11:59:26

标签: c++

这是一个面试问题

你必须在二维数组中找到一个字符串。输入包含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;
}

1 个答案:

答案 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)