Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 151 additions & 0 deletions MayssaraOmar/assignment3/Word search/src/DictionaryTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
#include "DictionaryTest.h"
#include "test.h"
#include "dictionary.h"

void DictionaryTest::run_all_tests() {
insert_remove_oneword();
insert_remove_vector();
isWord_true();
isWord_false();
isPrefix_true();
isPrefix_false();
clear_empty();
empty_dictionary();
}

void DictionaryTest::insert_remove_oneword() {
dictionary dic;
// test insert
dic.insert("hello");
dic.insert("world");
EXPECT_TRUE(dic.isWord("hello"));
EXPECT_TRUE(dic.isWord("world"));
// test remove
dic.remove("hello");
dic.remove("wor");
EXPECT_FALSE(dic.isWord("hello"));
EXPECT_TRUE(dic.isWord("world"));
}

void DictionaryTest::insert_remove_vector() {
dictionary dic;
vector<string> words_insert(4);
words_insert[0] = "cat";
words_insert[1] = "cart";
words_insert[2] = "card";
words_insert[3] = "car";
// test insert
dic.insert(words_insert);
EXPECT_TRUE(dic.isWord("cat"));
EXPECT_TRUE(dic.isWord("car"));
EXPECT_TRUE(dic.isWord("cart"));
EXPECT_TRUE(dic.isWord("card"));
// test remove
vector<string> words_remove(2);
words_remove[0] = "car";
words_remove[1] = "card";
dic.remove(words_remove);
EXPECT_TRUE(dic.isWord("cat"));
EXPECT_FALSE(dic.isWord("car"));
EXPECT_TRUE(dic.isWord("cart"));
EXPECT_FALSE(dic.isWord("card"));
}

void DictionaryTest::isWord_true() {
dictionary dic;
dic.insert("world");
dic.insert("cat");
dic.insert("cart");
dic.insert("CARD");
dic.insert("CAR");
EXPECT_TRUE(dic.isWord("world"));
EXPECT_TRUE(dic.isWord("cat"));
EXPECT_TRUE(dic.isWord("cart"));
EXPECT_TRUE(dic.isWord("CARD"));
EXPECT_TRUE(dic.isWord("CAR"));
}

void DictionaryTest::isWord_false() {
dictionary dic;
dic.insert("cat");
dic.insert("cart");
dic.insert("CARD");
dic.insert("CAR");
EXPECT_FALSE(dic.isWord("CAT"));
EXPECT_FALSE(dic.isWord("CART"));
EXPECT_FALSE(dic.isWord("card"));
EXPECT_FALSE(dic.isWord("car"));
EXPECT_FALSE(dic.isWord(""));
EXPECT_FALSE(dic.isWord("�"));
}

void DictionaryTest::isPrefix_true() {
dictionary dic;
dic.insert("world");
dic.insert("cat");
dic.insert("car");
dic.insert("cart");
dic.insert("CARD");
dic.insert("CAR");
dic.insert("������");
EXPECT_TRUE(dic.isPrefix(""));
EXPECT_TRUE(dic.isPrefix("w"));
EXPECT_TRUE(dic.isPrefix("wo"));
EXPECT_TRUE(dic.isPrefix("wor"));
EXPECT_TRUE(dic.isPrefix("worl"));
EXPECT_TRUE(dic.isPrefix("world"));
EXPECT_TRUE(dic.isPrefix("cat"));
EXPECT_TRUE(dic.isPrefix("ca"));
EXPECT_TRUE(dic.isPrefix("c"));
EXPECT_TRUE(dic.isPrefix("car"));
EXPECT_TRUE(dic.isPrefix("cart"));
EXPECT_TRUE(dic.isPrefix("C"));
EXPECT_TRUE(dic.isPrefix("CA"));
EXPECT_TRUE(dic.isPrefix("CARD"));
EXPECT_TRUE(dic.isPrefix("CAR"));
EXPECT_TRUE(dic.isPrefix("�"));
EXPECT_TRUE(dic.isPrefix("��"));
EXPECT_TRUE(dic.isPrefix("���"));
EXPECT_TRUE(dic.isPrefix("����"));
EXPECT_TRUE(dic.isPrefix("�����"));
EXPECT_TRUE(dic.isPrefix("������"));
}

void DictionaryTest::isPrefix_false() {
dictionary dic;
dic.insert("hello");
dic.insert("earth");
EXPECT_FALSE(dic.isPrefix("E"));
EXPECT_FALSE(dic.isPrefix("EARTH"));
EXPECT_FALSE(dic.isPrefix("EaRtH"));
EXPECT_FALSE(dic.isPrefix("ERH"));
EXPECT_FALSE(dic.isPrefix("H"));
EXPECT_FALSE(dic.isPrefix("HELLO"));
EXPECT_FALSE(dic.isPrefix("HeLlO"));
EXPECT_FALSE(dic.isPrefix("HLO"));
EXPECT_FALSE(dic.isPrefix(" "));
EXPECT_FALSE(dic.isPrefix("�"));
}

void DictionaryTest::clear_empty() {
dictionary dic;
dic.insert("hi");
EXPECT_FALSE(dic.empty());
dic.clear();
EXPECT_TRUE(dic.empty());
}

void DictionaryTest::empty_dictionary() {
dictionary dic;
EXPECT_TRUE(dic.empty());
dic.remove("hi");
dic.clear();
EXPECT_FALSE(dic.isPrefix("h"));
EXPECT_FALSE(dic.isPrefix("hi"));
EXPECT_FALSE(dic.isWord("hi"));
dic.insert("hi");
EXPECT_TRUE(dic.isPrefix("h"));
EXPECT_TRUE(dic.isPrefix("hi"));
EXPECT_TRUE(dic.isWord("hi"));
EXPECT_FALSE(dic.empty());
}
17 changes: 17 additions & 0 deletions MayssaraOmar/assignment3/Word search/src/DictionaryTest.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef DICTIONARYTEST_H_
#define DICTIONARYTEST_H_

class DictionaryTest {
public:
static void insert_remove_oneword();
static void insert_remove_vector();
static void isWord_true();
static void isWord_false();
static void isPrefix_true();
static void isPrefix_false();
static void clear_empty();
static void empty_dictionary();
static void run_all_tests();
};

#endif /* DICTIONARYTEST_H_ */
60 changes: 60 additions & 0 deletions MayssaraOmar/assignment3/Word search/src/Word search.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#include <map>
#include "word search.h"
using namespace std;

// internal function
// cache maps a pair of a (cell position (row, col)) and a string (prefix) to a boolean to ensure that (get_words_from_grid) method doesn't run for the same inputs more than once using memoization technique
static void get_words_from_grid(const vector<vector<char> > &grid, int row,
int col, string prefix, vector<vector<bool>>* visited,
map<pair<pair<int, int>, string>, bool>* cache, const dictionary &dic,
unordered_set<string>* words) {
// result has been already computed for these inputs
if ((*cache)[make_pair(make_pair(row, col), prefix)]) {
return;
}
string word = prefix + grid[row][col];
// word exits in dictionary
if (dic.isWord(word)) {
words->insert(word);
}
// prefix doesn't exist in dictionary
if (!dic.isPrefix(word)) {
return;
}
// recurse on all non-visited 8 directions
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
int drow = row + i;
int dcol = col + j;
// boundary check
if (drow < 0 || drow >= grid.size() || dcol < 0 || dcol >= grid[drow].size()) {
continue;
}
if (!(*visited)[drow][dcol]) {
(*visited)[drow][dcol] = true;
get_words_from_grid(grid, drow, dcol, word, visited,
cache, dic, words);
// (row-1 col-1 left up) (row-1 col up) (row-1 col+1 up right)
// (row col-1 left) (row col current) (row col+1 right)
// (row+1 col-1 left down) (row+1 col down) (row+1 col+1 down right)
(*visited)[drow][dcol] = false;
}
}
}
(*cache)[make_pair(make_pair(row, col), prefix)] = true;
}

void get_words_from_grid(const vector<vector<char> > &grid,
const dictionary &dic, unordered_set<string>* words) {
vector<vector<bool>> visited(grid.size());
for (int i = 0; i < grid.size(); i++) {
visited[i].resize(grid[i].size(), false);
}
map<pair<pair<int, int>, string>, bool> cache;
for (int r = 0; r < grid.size(); r++) {
for (int c = 0; c < grid[r].size(); c++) {
get_words_from_grid(grid, r, c, "", &visited, &cache, dic, words);
}
}
return;
}
11 changes: 11 additions & 0 deletions MayssaraOmar/assignment3/Word search/src/Word search.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef WORD_SEARCH_H_
#define WORD_SEARCH_H_

#include <unordered_set>
#include "dictionary.h"

// takes a chars grid, a dictionary and an unordered_set to store the output
// the method finds all the words from the dictionary that can be formed in the grid and insert them in the unordered_set
void get_words_from_grid(const vector<vector<char> > &grid, const dictionary &dic, unordered_set<string>* words);

#endif /* WORD_SEARCH_H_ */
Loading