Group chars in an array if they have the same start and end elements
I agree that the question takes a little time to understand. Once I understood it, I felt compelled to code a solution, which is below.

The solution you built gets the length between each letter, but the question is more nuanced.  The formal logic is in the code, but in plain English: A scene only ends when all of the shots it contains are done.

On a related note, I would consider your solution to be a "procedural" approach to solving the problem. 

As an object-oriented language, C# lends itself to the "object-oriented" approach, which to me means modeling the domain with classes. In this case, a Movie class and a Scene class. I initially thought there would be a Shot class, but in this example shots are reduced to character labels, so it was unnecessary. 

Of course a real solution would definitely contain a Shot class, perhaps with additional properties like Camera, Lighting, and Description.

Here is the output:


Here is the sample code:

using System;
using System.Collections.Generic;
using System.Linq;

public class App_MovieScenes
{
    public void Run()
    {
        var shotList = new char[] { 'a', 'b', 'a', 'b', 'c', 'b', 'a', 'c', 'a', 'd', 'e', 'f', 'e', 'g', 'd', 'e', 'h', 'i', 'j', 'h', 'k', 'l', 'i', 'j' };
        var movie = new Movie(shotList);
        movie.ToScenes();
        movie.Output();
    }        
}

public class Movie
{
    private char[] shotList;

    public List&lt;Scene&gt; Scenes { get; private set; }

    public Movie(char[] shotList) =&gt; this.shotList = shotList ?? new char[1];

    public void ToScenes()
    {
        var all = new string(shotList);
        var groups = new List&lt;List&lt;char&gt;&gt;();
        var group = new List&lt;char&gt;();
        var index = 0;

        all.ToList().ForEach(c =&gt;
        {
            var remaining = all.Substring(index++);
            var groupIsEmpty = !group.Any();
            var anyInGroupHasMore = group.Any(g =&gt; remaining.Contains(g));

            if (groupIsEmpty || !anyInGroupHasMore)
            {
                ///start a new group
                group = new List&lt;char&gt;();
                group.Add(c);
                groups.Add(group);
            }
            else
            {
                ///add to current group
                group.Add(c);
            }
        });

        Scenes = groups.Select(g =&gt; new Scene(g)).ToList();
    }

    public void Output() =&gt; Console.WriteLine(ToString());

    public override string ToString() =&gt; string.Join("\n", Scenes.Select(s =&gt; s.ToShotList()));
}

public class Scene
{
    public List&lt;char&gt; Shots { get; private set; }
    public int Length =&gt; Shots.Count;

    public Scene(List&lt;char&gt; shots) =&gt; Shots = shots;

    public string ToShotList() =&gt; $"{Length}\t{string.Join(", ", Shots)}";
}