using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.Linq;
class
GFG
{
static
string
AddParentheses(
string
s,
string
[] subs)
{
int
[][] interval =
new
int
[subs.Length][];
for
(
int
i = 0; i < subs.Length; i++)
{
interval[i] = FindSubStringIndex(subs[i], s);
}
Array.Sort(interval, (a, b) => a[0] - b[0]);
ArrayList mergedInterval = MergeIntervals(interval);
string
ans =
""
;
int
pre = 0;
foreach
(ArrayList arr
in
mergedInterval)
{
ans += s.Substring(pre, (
int
)arr[0] - pre);
ans +=
"("
;
ans += s.Substring((
int
)arr[0], (
int
)arr[1] - (
int
)arr[0] + 1);
ans +=
")"
;
pre = (
int
)arr[1] + 1;
}
ans += s.Substring(pre, s.Length - pre);
return
ans;
}
private
static
ArrayList MergeIntervals(
int
[][] interval)
{
ArrayList mergedInterval =
new
ArrayList();
int
start = interval[0][0];
int
end = interval[0][1];
for
(
int
i = 1; i < interval.Length; i++)
{
if
(interval[i][0] <= end
|| interval[i][0] == end + 1)
{
end = Math.Max(end, interval[i][1]);
}
else
{
ArrayList al =
new
ArrayList();
al.Add(start);
al.Add(end);
mergedInterval.Add(al);
start = interval[i][0];
end = interval[i][1];
}
}
ArrayList al2 =
new
ArrayList();
al2.Add(start);
al2.Add(end);
mergedInterval.Add(al2);
return
mergedInterval;
}
static
int
[] FindSubStringIndex(
string
subStr,
string
s)
{
int
i = 0, j = subStr.Length;
while
(j <= s.Length)
{
if
(s.Substring(i, j - i).Equals(subStr))
{
return
new
int
[] { i, j - 1 };
}
j++;
i++;
}
return
null
;
}
public
static
void
Main(
string
[] args)
{
string
S =
"abcdefgh"
;
string
[] subs = {
"ef"
,
"bc"
,
"g"
};
Console.WriteLine(AddParentheses(S, subs));
}
}