Найти подмножества строки, но только соседи - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь извлечь подмножества, но не все из них, только что является соседом . Простой пример ниже;

Ввод:"123456789"

Результат:

3. Подмножество уровня: out3: [ 123.234.345.456.567.678.789] .. 5. Подмножество уровней: out5: [12345,23456,34567,45678,56789] .. 8. Подмножество уровней: out8: [12345678,23456789]

result = [out1, .., out5, .. out8]

Если для этого есть классное решение и если это может быть строковая операция, это будет хорошо.

Большое спасибо

Ответы [ 5 ]

1 голос
/ 09 января 2020
public IEnumerable<string> GetSubsets(string input, int length)
{
    if (string.IsNullOrEmpty(input)) 
        throw new ArgumentException("Invalid string");

    if (length <= 0) 
        throw new ArgumentException("Length must be greater than 0.");

    if (length > input.Length) 
        throw new ArgumentException("The desired set length is longer than the string");

    for(int i = 0; i<=input.Length - length;i++)
    {
       yield return input.Substring(i, length);
    }
}
1 голос
/ 09 января 2020

Вам нужно будет выполнить дополнительные проверки ошибок, чтобы увидеть, превышает ли level длину строки и т.д. c.

public static void Main(string[] args)
{
    var results = FindSubsets("123456789", 3);
    Console.Read();
}

public static List<string> FindSubsets(string data, int level)
{
    if (level > data.Length || level < 1)
        return null;

    var results = new List<string>();
    for (int i = 0; i < data.Length - level + 1; i++)
    {
        results.Add(data.Substring(i, level));
    }
    return results;
}

Редактировать:

Добавлена ​​проверка длины строки для level.

Edit2:

Если вы хотите найти подмножества определенной длины, вы можете сделать что-то вроде следующего. Создайте List<int> со всеми уровнями, в которых вы хотите найти подмножества, а затем повторно вызывайте функцию. Например, допустим, вы хотите найти подмножества для уровней 3, 5 и 8. Затем:

var data = "123456789";
var levels = new List<int>() { 3, 5, 8 };

var results = new List<List<string>>();
foreach(var level in levels)
{
    results.Add(FindSubsets(data, level));
}
0 голосов
/ 10 января 2020

Поиск всех подмножеств:

var Input = "123456789";
var Result = Enumerable
    .Range(1, Input.Length)
    .Select(i => Enumerable
        .Range(0, Input.Length - i + 1)
        .Select(j => Input.Substring(j, i)))
    .ToList();

Чтобы ограничиться только некоторыми уровнями, такими как 3, 5 или 8, просто отфильтруйте перед выполнением работы, как это сделано ниже:

var Levels = new List<int>{ 3, 5, 8 };
var Input = "123456789";
var Result = Enumerable
    .Range(1, Input.Length)
    .Where(i => Levels.Contains(i)) // Filter the levels you need before constructing the subsets.
    .Select(i => Enumerable
        .Range(0, Input.Length - i + 1)
        .Select(j => Input.Substring(j, i)))
    .ToList();

Результаты:

123, 234, 345, 456, 567, 678, 789

12345, 23456, 34567, 45678, 56789

12345678, 23456789

0 голосов
/ 10 января 2020

Я, в основном, просто грубо заставил ответить:

import java.util.ArrayList;

public class MyClass {

    public static ArrayList<ArrayList<String>> getAllSubets(String input){
        ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();

        ArrayList<String> out = new ArrayList<String>();            

        for(int i= input.length(); i>=0; i--){
            int z = i;
            for(int j = 0; j+i<input.length() ;j++){
                z++;
                out.add(input.substring(j, z));
            }  
        }

        list.add(out);

        return list;

    }



    public static void main(String args[]) {
        System.out.println(MyClass.getAllSubets("123456789"));
    }
}

Вывод:

[[123456789, 12345678, 23456789, 1234567, 2345678, 3456789, 123456, 234567, 345678, 456789, 12345, 23456, 34567, 45678, 56789, 1234, 2345, 3456, 4567, 5678, 6789, 123, 234, 345, 456, 567, 678, 789, 12, 23, 34, 45, 56, 67, 78, 89, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

Это был забавный вопрос, чтобы его легко было споткнуть с индексами.

0 голосов
/ 09 января 2020

Да, это можно сделать с помощью регулярных выражений:

string input = "123456789";
int size = 3; // set to whatever
MatchCollection split = Regex.Matches(input, @$"\d{{size}}");
string delimited = string.Join(",", split);

или в качестве метода расширения:

public static string Delimit(this string s, int size)
{
    MatchCollection split = Regex.Matches(input, @$"\d{{size}}");
    return delimited = string.Join(",", split);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...