规则

在一个由大小写字母组成的矩阵中查找一个给定的字符串,这个字符串要求在矩阵中串成一个拐直角弯的相连序列,

形状像贪吃蛇一样,如果矩阵中存在这样的序列则查找成功。

目录结构

src/main.cpp

#include "../include/findstr.h"
int main(int argc, char* argv[])
{
if(argc !=3)
{
cout<<"argc should is 3, now it is "<<argc<<endl;
return 1;
}
findStr(argv[1],argv[2]);
return 0;
}

src/findstr.cpp

#include "../include/findstr.h"

using namespace std;
StrMatrix::StrMatrix(vector<string>&vectstr)
{
row = vectstr.size();
if(row>0)
{
col = vectstr[0].length();
}
else
return;
size = row*col;
pchar = new char[size];
pflag= new int[size];
int trow=0;
for (string str :vectstr)
{
for(int j=0; j<col ; j++)
pchar[j+trow*col] = str[j];
trow++;
}
}
void StrMatrix::clearFlag()
{
for (unsigned j = 0; j<size; j++)
{
pflag[j] = 1;
}
}
void StrMatrix::print()
{
for (unsigned j = 0; j<size; j++)
{
cout<<pchar[j]<<" ";
if((j+1)%col==0)
cout<<endl;
}
} char StrMatrix::getchar(unsigned i, unsigned j)
{
if(i<row && j<col)
return pchar[i*col+j];
else
return ' ';
}
StrMatrix::~StrMatrix()
{
if (pchar != NULL)
{
delete[]pchar;
pchar= NULL;
}
if (pflag!= NULL)
{
delete[]pflag;
pflag= NULL;
}
}
void StrMatrix::setUsed(unsigned i,unsigned j)
{
if(i<row && j<col)
pflag[i*col+j]=0;
}
int StrMatrix::notUsed(unsigned i,unsigned j)
{
if(i<row && j<col)
return pflag[i*col+j] ;
else
return 0;
}
vector<string> split(const string &str, string ch = " ")
{
vector<string>ret;
int pos = 0;
int start = 0;
while ((pos = str.find(ch, start) )!= string::npos )
{
//cout << "pos:" << pos << endl;
if (pos>start)
ret.push_back(str.substr(start, pos-start));
start = pos+ch.size();
}
if (str.size()>start)
ret.push_back(str.substr(start));
return ret;
} int checkPos(int i,int j, int*pos, char ch, int &validnum, StrMatrix &charMat)
{
if(charMat.notUsed(i,j) && charMat.getchar(i,j) == ch)
{
pos[validnum] = i;
pos[validnum+1] = j;
validnum+=2;
}
} int recursion(int i,int j,StrMatrix &charMat, string curstr)
{
int ret=1;
int pos[6];
int validnum=0;
checkPos(i,j+1,pos,curstr[0],validnum,charMat);
checkPos(i,j-1,pos,curstr[0],validnum,charMat);
checkPos(i-1,j,pos,curstr[0],validnum,charMat);
checkPos(i+1,j,pos,curstr[0],validnum,charMat); if(validnum>0 && curstr.length()==1)
{
//cout<<"has find!"<<endl<<endl;
return 0;
}
for(int cnt=0; cnt<validnum; cnt+=2)
{
//cout<<"ch: "<<charMat.getchar(pos[cnt],pos[cnt+1])<<endl;
charMat.setUsed(pos[cnt],pos[cnt+1]);
ret = recursion(pos[cnt],pos[cnt+1], charMat, curstr.substr(1));
if(ret == 0)
return 0;
}
return ret;
}
int findSingleStr(StrMatrix &charMat, string& curstr)
{
int ret=1;
for(int i=0; i<charMat.row; i++)
{
for(int j=0; j<charMat.col ; j++)
{
if(charMat.getchar(i,j) == curstr[0] )
{
if(curstr.length()==1)
return 0;
cout<<"head char:"<<charMat.getchar(i,j)<<endl;
charMat.clearFlag();
charMat.setUsed(i,j);
ret = recursion(i,j,charMat,curstr.substr(1));
if (ret == 0)
{
cout<<"find str:"<<curstr<<endl;
return 0;
}
}
}
}
return ret;
}
int findStr(string argvone,string argvtwo)
{
vector<string>onemat=split(argvone);
StrMatrix charMat(onemat);
charMat.print(); vector<string>strMatrix=split(argvtwo); int ret=0;
for (string curstr :strMatrix)
{
//cout<<"curstr:"<<curstr<<endl;
ret |= findSingleStr(charMat, curstr );
}
return ret; }

include/findstr.h

#include<iostream>
#include<string>
#include<vector>
using namespace std; class StrMatrix{
public:
unsigned row, col, size;
char*pchar;
int*pflag;
StrMatrix(vector<string>&vectstr);
~StrMatrix();
void setUsed(unsigned i,unsigned j);
int notUsed(unsigned i,unsigned j);
void clearFlag();
void assignCharArr(vector<string>&);
char getchar(unsigned i, unsigned j);
void print();
}; vector<string> split(const string &str, string ch ); int findSingleStr(StrMatrix &charMat, string& curstr); int findStr(string argvone,string argvtwo);

ft/TestCase.cpp



#include <gtest/gtest.h>
#include "../include/findstr.h"
TEST(FooTest, SingleCharCase)
{
EXPECT_EQ(findStr("qwer asdf zxcv", "s a d"),0);
}
TEST(FooTest, multiStrCase)
{
EXPECT_EQ(findStr("qwer asdf zxcv", "qwsxcv qwedsazxcv rfvcxzaswq"),0);
}
TEST(FooTest, UseTwiceiSameChar)
{
EXPECT_EQ(findStr("qwer asdf zxcv", "aa cvc qazxz"),1);
} TEST(FooTest, NotSerieschar)
{
EXPECT_EQ(findStr("qwer asdf zxcv", "qsc asf zxdf qwdf"),1);
}

ft/makefile

cc = g++ -std=c++11
prom = ../output/ft
deps = ../include/findstr.h
obj = ../src/findstr.o TestCase.o
LIBS = -lgtest -lgtest_main -lpthread $(prom): $(obj)
$(cc) $(obj) $(LIBS) -o $(prom) %.o: %.c $(deps)
$(cc) -c $< -o $@

ftbuild.sh

cd ft
make
cd ../output
echo $(pwd)
./ft

mainbuild.sh

g++ -std=c++11 -g src/*.cpp -o output/findstr

findStr的更多相关文章

  1. [转]FINDSTR正则表达式小结

    前言:最近写了一个bat用于快速编译swf至目标目录,想利用FINDSTR命令通过匹配目标目录名称,匹配数量大概600多个,发现匹配耗时比较久,大概花费10余秒,因此还是放弃字符匹配,乖乖拼出全称来定 ...

  2. findstr 命令

    body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...

  3. matlab中findstr,strfind,strcmp,strncmp区别与联系

    在Matlab中,这几个函数区分如下: (以下默认S1和S2是字符串,同样也适用于cell细胞类型数据,也就是循环对cell中每个元素分别判断即可.) findstr(S1,S2):寻找是否有S1和S ...

  4. findstr()与strfind()的区别

    matlab中这两个字符串查找的函数findstr(), strfind()表明上看起来用法相似,效果也相似. 1. findstr(s1,s2)--在较长的字符串中查找较短的字符串出现的次数,并返回 ...

  5. netstat -aon|findstr 8888 终止进程

    netstat -aon|findstr 8888 # 根据端口号查找进程C:\Users\Administrator>netstat -ano | findstr TCP LISTENING ...

  6. 入门命令13-字符串查找增强:findstr

    http://www.cnblogs.com/doupip/archive/2011/12/23/2299210.html 在文件中寻找字符串. FINDSTR [/B] [/E] [/L] [/R] ...

  7. 批处理 Mysql Findstr

    @set Dump_IP=localhost @set User_Name=root @set Password=1234 @set curPath=%~dp0 mysql -h %Dump_IP% ...

  8. find和findstr

    find与findstr 例“ 在文件中搜索字符串. 1.findstr . 2.txt 或 Findstr "." 2.txt 从文件2.txt中查找任意字符,不包括空字符或空行 ...

  9. 【CMD】findstr命令

    findstr用来搜索匹配字符串的文件. FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [ ...

  10. 批处理find&findstr命令--众里寻他一次度

    find 使用 Command: find [/v][/c][/n][/i] "string" [[drive:][path]filename] Parameter: /v 显示所 ...

随机推荐

  1. Clion使用MinGW编译好的boost库

    MinGW编译Boost库可以参考我之前写的编译Boost的文章. 以下是cmake链接boost静态库的配置: cmake_minimum_required(VERSION 3.8) project ...

  2. OpenLayers4地图实例-功能齐全

    网址:http://api.rivermap.cn/openlayers4/map.min.html 标注 工具

  3. 我的IT之路这样走过

    一.我的IT之路这样走过: 1.大一上学期.我们学校是用C语言做启蒙语言的:虽然我学的相当不错,但是我发现一个问题:用C语言做软件那么它的交付周期比较长. 对于我这种无产阶级来说最关键的是解眼下的粮食 ...

  4. Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理

    Atitit 管理的模式扁平化管理  金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理 1.1. 矩阵管理 1 1.2. 相关信息 矩阵的历史 1 1.3. 基于“ ...

  5. Oracle null判断并替换空值

      可用 NVL(), IFNULL() ,COALESCE(),DECODE() 函数 1.NVL() 从两个表达式返回一个非 null 值.语法NVL(eExpression1, eExpress ...

  6. 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

    一.实验说明: 信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节.当系统中的多个任务 在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互 相加以必要的限制 ...

  7. mac os系统go安装:go install github.com/nsf/gocode: open /usr/local/go/bin/gocode: permission denied

    gocode是go语言代码自动提示工具 安装时进入src目录执行:go get -u github.com/nsf/gocode 出现: github.com/nsf/gocode (download ...

  8. java 爬取 国税局 省市区级联关系

    爬取网址 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/index.html 因为数据比较大,存储为一个json,会内存溢出. 所以按照每 ...

  9. mac安装Redis可视化工具-Redis Desktop Manager

    Redis是一个超精简的基于内存的键值对数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公自带一个最小化的命令行式的数据库管理工具,有时侯使用起 ...

  10. [转java发送http的get、post请求]

    Http请求类 package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io. ...