По заданному массиву строк найдите, можно ли заданные цепочки объединить в цепочку. Строка X может быть помещена перед другой строкой Y в круге, если последний символ X совпадает с первым символом Y.
Примеры:
Input: arr[] = {"geek", "king"}
Output: Yes, the given strings can be chained.
Note that the last character of first string is same
as first character of second string and vice versa is
also true.
Input: arr[] = {"for", "geek", "rig", "kaf"}
Output: Yes, the given strings can be chained.
The strings can be chained as "for", "rig", "geek"
and "kaf"
Input: arr[] = {"aab", "bac", "aaa", "cda"}
Output: Yes, the given strings can be chained.
The strings can be chained as "aaa", "aab", "bac"
and "cda"
Input: arr[] = {"aaa", "bbb", "baa", "aab"};
Output: Yes, the given strings can be chained.
The strings can be chained as "aaa", "aab", "bbb"
and "baa"
Input: arr[] = {"aaa"};
Output: Yes
Input: arr[] = {"aaa", "bbb"};
Output: No
Input : arr[] = ["abc", "efg", "cde", "ghi", "ija"]
Output : Yes
These strings can be reordered as, “abc”, “cde”, “efg”,
“ghi”, “ija”
Input : arr[] = [“ijk”, “kji”, “abc”, “cba”]
Output : No
Идея состоит в том, чтобы создать ориентированный граф из всех символов и затем найти, является ли их эйлерова схема в графе или нет.
Графическое представление некоторых строковых массивов приведено на диаграмме ниже,

Если существует эйлерова цепь , то цепь может быть сформирована, иначе нет.
Обратите внимание, что ориентированный граф имеет эйлерову схему только в том случае, если в степени и степени степень каждой вершины одинакова, и все вершины, отличные от нуля, образуют одну сильно связную компоненту.
Ниже приведены подробные шаги алгоритма.
1) Создайте ориентированный граф g с количеством вершин, равным размеру алфавита. Мы создали граф с 26 вершинами в программе ниже.
2) Выполните следующие действия для каждой строки в данном массиве строк.
… ..A) Добавить ребро от первого символа к последнему символу данного графа.
3) Если созданный граф имеет эйлерову схему , вернуть true, иначе вернуть false.
Ниже приведены реализации вышеуказанного алгоритма на C ++ и Python.
C / C ++
#include<iostream> #include <list> #define CHARS 26
using namespace std;
class Graph
{
int V;
list< int > *adj;
int *in;
public :
Graph( int V);
~Graph() { delete [] adj; delete [] in; }
void addEdge( int v, int w) { adj[v].push_back(w); (in[w])++; }
bool isEulerianCycle();
bool isSC();
void DFSUtil( int v, bool visited[]);
Graph getTranspose();
};
Graph::Graph( int V)
{
this ->V = V;
adj = new list< int >[V];
in = new int [V];
for ( int i = 0; i < V; i++)
in[i] = 0;
}
bool Graph::isEulerianCycle()
{
if (isSC() == false )
return false ;
for ( int i = 0; i < V; i++)
if (adj[i].size() != in[i])
return false ;
return true ;
}
void Graph::DFSUtil( int v, bool visited[])
{
visited[v] = true ;
list< int >::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
if (!visited[*i])
DFSUtil(*i, visited);
}
Graph Graph::getTranspose() {
Graph g(V);
for ( int v = 0; v < V; v++)
{
list< int >::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
{
g.adj[*i].push_back(v);
(g.in[v])++;
}
}
return g;
}
bool Graph::isSC()
{
bool visited[V];
for ( int i = 0; i < V; i++)
visited[i] = false ;
int n;
for (n = 0; n < V; n++)
if (adj[n].size() > 0)
break ;
DFSUtil(n, visited);
for ( int i = 0; i < V; i++)
if (adj[i].size() > 0 && visited[i] == false )
return false ;
Graph gr = getTranspose();
for ( int i = 0; i < V; i++)
visited[i] = false ;
gr.DFSUtil(n, visited);
for ( int i = 0; i < V; i++)
if (adj[i].size() > 0 && visited[i] == false )
return false ;
return true ;
}
bool canBeChained(string arr[], int n)
{
Graph g(CHARS);
for ( int i = 0; i < n; i++)
{
string s = arr[i];
g.addEdge(s[0]- 'a' , s[s.length()-1]- 'a' );
}
return g.isEulerianCycle();
}
int main()
{
string arr1[] = { "for" , "geek" , "rig" , "kaf" };
int n1 = sizeof (arr1)/ sizeof (arr1[0]);
canBeChained(arr1, n1)? cout << "Can be chained n" :
cout << "Can't be chained n" ;
string arr2[] = { "aab" , "abb" };
int n2 = sizeof (arr2)/ sizeof (arr2[0]);
canBeChained(arr2, n2)? cout << "Can be chained n" :
cout << "Can't be chained n" ;
return 0;
}
|
питон
CHARS = 26
class Graph( object ):
def __init__( self , V):
self .V = V
self .adj = [[] for x in xrange (V)]
self .inp = [ 0 ] * V
def addEdge( self , v, w):
self .adj[v].append(w)
self .inp[w] + = 1
def isSC( self ):
visited = [ False ] * self .V
n = 0
for n in xrange ( self .V):
if len ( self .adj[n]) > 0 :
break
self .DFSUtil(n, visited)
for i in xrange ( self .V):
if len ( self .adj[i]) > 0 and visited[i] = = False :
return False
gr = self .getTranspose()
for i in xrange ( self .V):
visited[i] = False
gr.DFSUtil(n, visited)
for i in xrange ( self .V):
if len ( self .adj[i]) > 0 and visited[i] = = False :
return False
return True
def isEulerianCycle( self ):
if self .isSC() = = False :
return False
for i in xrange ( self .V):
if len ( self .adj[i]) ! = self .inp[i]:
return False
return True
def DFSUtil( self , v, visited):
visited[v] = True
for i in xrange ( len ( self .adj[v])):
if not visited[ self .adj[v][i]]:
self .DFSUtil( self .adj[v][i], visited)
def getTranspose( self ):
g = Graph( self .V)
for v in xrange ( self .V):
for i in xrange ( len ( self .adj[v])):
g.adj[ self .adj[v][i]].append(v)
g.inp[v] + = 1
return g
def canBeChained(arr, n):
g = Graph(CHARS)
for i in xrange (n):
s = arr[i]
g.addEdge( ord (s[ 0 ]) - ord ( 'a' ), ord (s[ len (s) - 1 ]) - ord ( 'a' ))
return g.isEulerianCycle()
arr1 = [ "for" , "geek" , "rig" , "kaf" ]
n1 = len (arr1)
if canBeChained(arr1, n1):
print "Can be chained"
else :
print "Cant be chained"
arr2 = [ "aab" , "abb" ]
n2 = len (arr2)
if canBeChained(arr2, n2):
print "Can be chained"
else :
print "Can't be chained"
|
Выход:
Can be chained
Can't be chained
Найти, можно ли связать массив строк в круг | Набор 2
Эта статья предоставлена Пиюшем Гуптой . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Найти, можно ли связать массив строк в круг | Набор 2
- Найти количество подстрок, символы которых можно переставить для формирования заданного слова
- Найдите самую длинную строку, которая может быть составлена из других строк из массива
- Поиск в массиве строк, где сортируются непустые строки
- Количество строк в первом массиве, которые меньше, чем каждая строка во втором массиве
- Можно сформировать треугольник из значений массива
- Сортировать массив в форме волны
- Найдите, находится ли подрешетка в форме горы или нет
- Найти индекс i такой, что префикс S1 и суффикс S2, пока я не сформирую палиндром при объединении
- Найти, может ли последовательность степеней образовывать простой граф | Алгоритм Гавела-Хакими
- Массив строк в C ++ (3 различных способа создания)
- Частота строки в массиве строк
- Самое частое слово в массиве строк
- Строки из массива, которые не являются префиксом любой другой строки
- Найти, если строка чередуется с двумя другими строками | DP-33
Найти, можно ли связать массив строк в круг | Комплект 1
0.00 (0%) 0 votes