이 가장 짧은 항목을 찾습니다 모든 문자열을 확인할 때까지 (공통 문자열이 발견되지 않은 경우) 것을 반복 명부.
그래서 우리는 "오늘"을 사용합니다.
는 "첫번째 긴"위해, 아래 각 문자에 문자열의 길이의 "오늘"의 연속 된 문자의 문자열 목록을 구축 할 수 있습니다.
"오늘",
"도다", "oday"
"여우", "ODA", "일",
"받는 사람", "OD", "다 ","AY "
"t ","O리스트 위에 ","D ","A ","Y "
열거 된 모든 다른 스트링 것을 포함하는 최초의 엔트리를 찾는 기입. 그것에 대해 좀 더 생각
List<string> words = new List<string> { "Today", "Monday", "Tuesday", "Wednesday" };
// Select shortest word in the list
string shortestWord = (from word in words
orderby word.Length
select word).First();
int shortWordLength = shortestWord.Length;
// Build up the list of consecutive character strings, in length order.
List<string> parts = new List<string>();
for (int partLength = shortWordLength; partLength > 0; partLength--)
{
for (int partStartIndex = 0; partStartIndex <= shortWordLength - partLength; partStartIndex++)
{
parts.Add(shortestWord.Substring(partStartIndex, partLength));
}
}
// Find the first part which is in all the words.
string longestSubString = (from part in parts where words.All(s => s.Contains(part)) select part).FirstOrDefault();
// longestSubString is the longest part of all the words, or null if no matches are found.
편집
, 당신은 조금을 최적화 할 수 있습니다.
당신은 부품의 목록을 구축 할 필요가 없습니다
-가 생성 될 때 단지 각 부분을 테스트합니다. 또한 단어 목록을 길이 순서로 정렬하여 가장 짧은 문자열을 먼저 테스트하여 후보 부분을 더 빨리 거부합니다.
string longestSubString = null;
List<string> words = new List<string> { "Todays", "Monday", "Tuesday" };
// Sort word list by length
List<string> wordsInLengthOrder = (from word in words
orderby word.Length
select word).ToList();
string shortestWord = wordsInLengthOrder[0];
int shortWordLength = shortestWord.Length;
// Work through the consecutive character strings, in length order.
for (int partLength = shortWordLength; (partLength > 0) && (longestSubString == null); partLength--)
{
for (int partStartIndex = 0; partStartIndex <= shortWordLength - partLength; partStartIndex++)
{
string part = shortestWord.Substring(partStartIndex, partLength);
// Test if all the words in the sorted list contain the part.
if (wordsInLengthOrder.All(s => s.Contains(part)))
{
longestSubString = part;
break;
}
}
}
Console.WriteLine(longestSubString);
내 견해로는 멋지고 깔끔한 솔루션에는 거대한 람다 표현이 필요하지 않습니다. 그리고 반드시 Linq을 포함하지 않습니다. –
일반적인 문자열이 없으면 어떻게됩니까? 예 : 밥, 프레드, 맥스? 아니면 월요일, 화요일 빌? 즉, 목록에있는 모든 항목에 공통된 문자가 너무 많지 않습니까? –
@IlyaKogan LINQ 일 필요는 없습니다.이 질문은 제가 사용했던 태그이기 때문에 LINQ 일뿐입니다. – LukeHennerley